Я только начал работать над проектом, в котором структура импорта - это то, чего я никогда не видел.
Вот структура пакета
foo/
__init__.py
bar/
__init__.py
module1.py
module2.py
Это содержимое bar/__init__.py
:
from .module1 import *
from .module2 import *
module1.py
просто выполняет импорт в направлении module2
(который пуст), но используя его абсолютный путь в проекте:
from foo.bar.module2 import *
При запуске кода из каталога foo
я могу без проблем импортировать module1
python -c "import foo.bar.module1" # This will raise no error
Однако мне сказали, что использование import *
из модуля - плохая практика (в вдобавок к тому, что код действительно трудно читать), поэтому я решил заменить импорт в foo/bar/module1.py
на:
import foo.bar.module2 as module2
Однако при попытке моей команды python я теперь получите AttributeError
:
python -c "import foo.bar.module1"
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/Users/loicm/test_structure/foo/bar/__init__.py", line 1, in <module>
from .module1 import *
File "/Users/loicm/test_structure/foo/bar/module1.py", line 1, in <module>
import foo.bar.module2 as mod
AttributeError: module 'foo' has no attribute 'bar'
Я очень запутался, поскольку, насколько я понимаю, разные команды импорта будут эквивалентны, так что если одна вызывает ошибку, вторая тоже
(Я знаю, что могу заставить его работать без использования from ... import *
, только импортировав функцию интересующие меня ионы вместо *
, но не объясняет почему не работает)