Почему python присоединяет импортированные модули к пакету? - PullRequest
1 голос
/ 09 февраля 2012

Почему Python присоединяет импортированные модули к пакету?Я знаю, что не должен беспокоиться об этом, но просто хотел узнать, есть ли какое-либо объяснение.В следующем случае я понял, что импорт logging добавит его в пространство имен модуля.Так зачем добавлять его в пространство имен пакета?

$ tree -I *.pyc
.
├── pkga
│   ├── __init__.py
│   └── modb.py
└── test.py

$ cat pkga/__init__.py
$
$ cat pkga/modb.py
import logging
import types


$ cat test.py 
import pkga.modb
import pprint
import sys

pprint.pprint(sorted([ x for x in sys.modules.keys() if x.startswith("pkg")]))

$ python test.py 
['pkga', 'pkga.logging', 'pkga.modb', 'pkga.types']

1 Ответ

1 голос
/ 09 февраля 2012

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

Редактировать:Благодаря комментариям я понял, что не отвечаю на реальный вопрос, поэтому pkga.logging и pkga.types находятся в списке?

Как указывает @vikki, это предотвращает возникновение проблемпри использовании того же имени модуля, что и у другого модуля в стандартной библиотеке.Например, если logging.py или types.py создано в pkga, ключи sys.modules не изменятся.Однако значения для pkga.logging и pkga.types больше не будут стандартными модулями, а будут реализованы в этом пакете.

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