Функция Python type() возвращает вызываемый

type(object) возвращает тип объекта.

>>> type(__builtins__)
<type 'module'>
>>> name = type(__builtins__)
>>> type(name)
<type 'type'>
>>> name
<type 'module'>

>>> name('my_module')
<module 'my_module' (built-in)>
>>> name('xyz')
<module 'xyz' (built-in)>
>>> 

В этом синтаксисе

my_module = type(__builtins__)('my_module')

type(__builtins__) должен возвращать вызываемый объект, который принимает ('my_module') в качестве аргумента. type(object) возвращает вызываемый объект?

Как понять, что это делает?


person overexchange    schedule 03.05.2017    source источник
comment
Да, type возвращает объект типа. Типовые объекты являются вызываемыми.   -  person vaultah    schedule 04.05.2017
comment
Я не понимаю вашего вопроса.   -  person juanpa.arrivillaga    schedule 04.05.2017
comment
@vaultah Вы имеете в виду, что type(__builtins__) отображает <type 'module'> на стандартном выходе и возвращает вызываемый объект?   -  person overexchange    schedule 04.05.2017
comment
<type 'module'> является repr объекта типа module.   -  person juanpa.arrivillaga    schedule 04.05.2017
comment
@juanpa.arrivillaga Я могу применить ('my_module') к объекту, если он имеет тип function. type(__builtins__) возвращает какую-то функцию?   -  person overexchange    schedule 04.05.2017
comment
Он возвращает тип, то есть класс. Вызов класса возвращает экземпляр указанного класса.   -  person Ignacio Vazquez-Abrams    schedule 04.05.2017
comment
Какие? Вы не можете применить (?) 'my_module' к любой функции, только к той, которая принимает один позиционный параметр. Но type(__builtins__) возвращает объект типа, который можно вызывать как функцию.   -  person juanpa.arrivillaga    schedule 04.05.2017
comment
Может быть, если вы объясните, чего вы пытаетесь достичь с помощью my_module = type(__builtins__)('my_module'). Объект my_module, который вы создаете таким образом, не будет очень полезен...   -  person juanpa.arrivillaga    schedule 04.05.2017


Ответы (2)


Давайте рассмотрим несколько примеров:


>>> type(int)
<class 'type'>

Итак, поскольку type(int) возвращает type, имеет смысл, что

>>> type(int)(12)
<class 'int'>

поскольку

>>> type(12)
<class 'int'>

Что еще более важно:

>>> (type(int)(12) == type(12)) and (type(int)(12) is type(12))
True

Теперь, если вы вместо этого сделаете:

>>> type(int())
<class 'int'>

что также ожидается, поскольку

>>> (int() == 0) and (int() is 0)
True

и

>>> (type(int()) = type(0)) and (type(int()) is type(0))
True

Итак, собираем вещи:

  • int является объектом типа type
  • int() — это (целочисленный) объект типа int

Другой пример:

>>> type(str())
<class 'str'>

что обозначает

>>> (type(str())() == '') and (type(str())() is '')
True

поэтому он ведет себя как строковый объект:

>>> type(str())().join(['Hello', ', World!'])
'Hello, World!'

У меня такое чувство, что я мог сделать это намного сложнее, чем оно есть на самом деле... это не так!


type() возвращает класс объекта. Так:

  • type(12) - это просто уродливый способ написать int
  • type(12)(12) - это просто уродливый способ написать int(12)

Итак, «Да!», type() возвращает вызываемый объект. Но гораздо лучше думать об этом как (из официальной документации)

класс тип(объект)

С одним аргументом вернуть тип объекта. Возвращаемое значение представляет собой объект типа и, как правило, тот же объект, что и объект, возвращаемый object.__class__.

person tpvasconcelos    schedule 03.05.2017
comment
Могу ли я сказать, что x = 1 внутри не что иное, как x = int(1)? Единственная разница в том, что x=int(1) - это более ООП-способ написания кода на Python. Гвидо предоставил синтаксический сахар x=1 из математического смысла. - person overexchange; 04.05.2017
comment
до сих пор не ясно, если x=myClass() не сбивает с толку, то как y=int() сбивает с толку. Если моя команда решит написать код Python в стиле oop, то x=1 будет выглядеть как математическое уравнение, несмотря на то, что int(1) выполняется внутри. - person overexchange; 04.05.2017
comment
Python не вызывает int() при запуске x=1. x=1 быстрее набирается, быстрее запускается, так как это самый питонический способ написания кода. См.: это и что - person tpvasconcelos; 04.05.2017

Функция type() возвращает класс объекта. В случае type(__builtins__) он возвращает тип Module. Семантика модуля подробно описана по адресу: https://docs.python.org/3/library/stdtypes.html#modules

Исходный код CPython содержит это в Objects/moduleobject.c::module_init():

static char *kwlist[] = {"name", "doc", NULL};
PyObject *dict, *name = Py_None, *doc = Py_None;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "U|O:module.__init__",
                                 kwlist, &name, &doc))

Это означает, что вы можете вызывать (создавать экземпляры) объектов модулей с именем модуля в качестве обязательного аргумента и строкой документации в качестве необязательного аргумента.

person Raymond Hettinger    schedule 03.05.2017