Не удается разрешить ситуацию «импортировать как» («Модуль x AttributeError не имеет атрибута y») - PullRequest
0 голосов
/ 06 июня 2018

У меня есть проект со следующей структурой:

project/
    driver.py
    lib/
        __init__.py
        core/
            util.py
            common.py
            __init__.py

# project/driver.py

import lib.core.common as abc
pass

# project/lib/core/__init__.py

from .util import Worker

# project/lib/core/util.py

import lib.core.common as abc

class Worker:
    pass

# project/lib/core/common.py

def stuff():
    pass

Теперь, когда я запускаю python3 driver.py (из каталога проекта), я получаю следующую ошибку:

Traceback (most recent call last):
  File "driver.py", line 1, in <module>
    import lib.core.common as abc
  File "/home/user/project/lib/core/__init__.py", line 1, in <module>
    from .util import Worker
  File "/home/user/project/lib/core/util.py", line 1, in <module>
    import lib.core.common as abc
AttributeError: module 'lib' has no attribute 'core'

Это происходит только при выполнении обоих условий:

  1. Когда я выполняюimport lib.core.common as abc вместо import lib.core.common.
  2. Когда project/lib/core/__init__.py содержит from .util import Worker import.

Дело в том, что я хотел бы сохранить форму import lib.core.common as abc import.

Может кто-нибудь объяснить, что здесь происходит, пожалуйста?

1 Ответ

0 голосов
/ 06 июня 2018

У вас есть круговой зависимый импорт.вы пытаетесь выполнить

import lib.core.common as abc

в двух файлах, в driver.py и в util.py

Самый простой способ исправить это - перенести импорт пути в конец узла.модуль, некоторые документы , или

def dostuff():
    from foo import bar
    ...

или это также будет работать,

from lib.core import common as abc

Когда Python импортирует модуль, он проверяет реестр модуля, чтобы увидеть,модуль уже был импортирован.Если модуль уже зарегистрирован, Python использует этот существующий объект из кэша.Реестр модулей - это таблица модулей, которые были инициализированы и проиндексированы по имени модуля.К этой таблице можно получить доступ через sys.modules.

Если он не был зарегистрирован, Python находит модуль, инициализирует его при необходимости и выполняет в пространстве имен нового модуля.

...