Как устранить эту ошибку импорта в Python 3.6?

У меня есть очень простой пакет пространства имен: https://github.com/korommatyi/import-error-repro (я опишу макет каталога ниже). Если я попытаюсь импортировать namespace_repro.moduleЯ получил следующую ошибку: AttributeError: module 'namespace_repro' has no attribute 'module', Насколько я понимаю, мой пакет имеет верный макет, и импорт должен работать. Интересно, что ошибка присутствует только в Python 3.6.8, и импорт успешно выполняется в Python 3.7.

Как воспроизвести проблему?

Я создал совершенно новую среду разработки Python 3.6 conda create -n namespace6 python=3.6 ipython, затем я активировал его и установил пакет как pip install -e ./import-error-repro (Обратите внимание, что -e не имеет значения, проблема воспроизводима без него). После этого я попробовал import namespace_repro.module в ipython (хотя то же самое происходит в официальном интерпретаторе Python). Результат

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-1-bcae5a697dad> in <module>
----> 1 import namespace_repro.module

~/namespace-repro/src/namespace_repro/module/__init__.py in <module>
----> 1 from namespace_repro.module.x import x

~/namespace-repro/src/namespace_repro/module/x.py in <module>
----> 1 import namespace_repro.module.y as y
      2 
      3 x = y.y

AttributeError: module 'namespace_repro' has no attribute 'module'
---------------------------------------------------------------------------

Странно то, что система импорта находит namespace_repro.module дважды, но не в третий раз!

Некоторое другое интересное поведение:

In [1]: import namespace_repro.module.y as y  # This doesn't work.
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-4-4035347ea59b> in <module>
----> 1 import namespace_repro.module.y as y

AttributeError: module 'namespace_repro' has no attribute 'module'

In [2]: import namespace_repro.module.y  # But this one does! Why?

In [3]: dir(namespace_repro.module.y) # The error returns when we actually want to use the module.
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-3-d89bcfd9e509> in <module>
----> 1 dir(namespace_repro.module.y)

AttributeError: module 'namespace_repro' has no attribute 'module'

In [4]: from namespace_repro.module.y import y  # This works fine!

In [5]: y
Out[5]: True

Макет каталога

. import-error-repro
+-- setup.py
+-- src
|   +-- namespace_repro
|   |   +-- module
|   |   |   +-- __init__.py
|   |   |   +-- x.py
|   |   |   +-- y.py

0 ответов

Это ошибка CPython 30024, которая, что неудивительно, была исправлена ​​в версии 3.7. Обратите внимание, что более идиоматическая форма с относительным (циклическим) импортом работает с 3.5.

Другие вопросы по тегам