Импорт абсолютного пути "из импорта пути *" работает, но не "импортировать путь как" - PullRequest
0 голосов
/ 03 августа 2020

Я только начал работать над проектом, в котором структура импорта - это то, чего я никогда не видел.

Вот структура пакета

 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 *, только импортировав функцию интересующие меня ионы вместо *, но не объясняет почему не работает)

...