Как Python работает с объектами, которые приходят из «других мест» - PullRequest
0 голосов
/ 07 февраля 2019

Это может быть глупый вопрос, но я не понимаю в Python, как мы можем использовать объект, который мы не определили или не импортировали.

Рассмотрим следующий пример, используя Python datetime module:

from datetime import date

date1 = date(2019,1,1)
date2 = date(2019,1,5)

type(date2-date1) #<class 'datetime.timedelta'>
type(date2)       #<class 'datetime.date'>

Тогда date2-date1 относится к классу timedelta, даже если мы не импортировали его.

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

Как это может быть?

Должен ли я думать об этих новых объектах, которые всплывают просто как фрагменты в памяти, которые возвращаются другими функциями, которые, даже если мы их не определили, содержат достаточно "в себе" информации, чтобыИнтерпретатор Python может осмысленно применять type() и другие функции к ним?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019
from datetime import date

Дата импортирует timedelta куда-то, так как это может быть зависимость, даже если вы ее не видите.

0 голосов
/ 07 февраля 2019

Вы ошибочно полагаете, что import ограничивает то, что загружается в память.import ограничивает то, что имена связаны в глобалиях вашего модуля .

Весь модуль все еще загружен, как и зависимости этого модуля.Тот факт, что ваше пространство имен не привязывает ссылку на объект datetime.timedelta, не означает, что он недоступен для модуля datetime.

См. import документация по выписке :

Форма from использует несколько более сложный процесс:

  1. найти модуль, указанный в предложении from, загрузка ипри необходимости инициализируйте его;
  2. для каждого из идентификаторов, указанных в предложениях import:
    1. проверьте, есть ли у импортированного модуля атрибут с таким именем
    2. , если нет,попытаться импортировать подмодуль с этим именем, а затем снова проверить импортированный модуль на наличие этого атрибута
    3. , если атрибут не найден, ImportError повышается.
    4. в противном случае ссылка на это значениехранится в локальном пространстве имен, используя имя в предложении as, если оно присутствует, в противном случае используется имя атрибута

Таким образом, загрузка и инициализация модулейотдельный шаг, выполненоNCE за модуль.Второй шаг связывает имена в вашем пространстве имен.

from datetime import date проверяет, загружен ли модуль datetime, затем находит datetime.date и добавляет date = datetime.date к вашему пространству имен.

Если вы хотите увидетькакие модули загружены, проверьте отображение sys.modules .Это место, где механизм операторов import проверяет , чтобы увидеть, загружен ли данный модуль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...