Підмодулі

Оновлено: 28.04.2023

Коли підмодуль завантажується за допомогою будь-якого механізму (наприклад, importlib API, import або import-from оператори, або вбудований __import__()), прив’язка розміщується в простір імен батьківського модуля до об’єкта підмодуля. Наприклад, якщо пакет spam має підмодуль foo, після імпорту spam.foo, spam матиме атрибут foo, який прив’язаний до підмодуля. Скажімо, у вас є така структура каталогів:

spam/
    __init__.py
    foo.py

а spam/__init__.py містить такий рядок:

from .foo import Foo

потім виконання наступного ставить прив’язки імен для foo і Foo в spam модуль:

>>> import spam
>>> spam.foo
<module 'spam.foo' from '/tmp/imports/spam/foo.py'>
>>> spam.Foo
<class 'spam.foo.Foo'>

Враховуючи знайомі правила прив’язки імен Python, це може здатися дивним, але насправді це фундаментальна функція системи імпорту. Незмінним є те, що якщо у вас є sys.modules['spam'] і sys.modules['spam.foo'] (як після імпорту вище), останній повинен відображатися як атрибут foo першого.