python - 如何解决这个循环导入问题?
问题描述
我有一个这样的图书馆。wckg 是库名称
wckg:
__init__.py
api/wckg_api.py
在__init__.py
中,我导入wckg_api
范围并定义了一个枚举:
from wckg.api import wckg_api
class RelType(Enum):
a = 1
b = 2
WCKG = wckg_api.Wckg()
在api/wckg_api.py
:
from wckg import RelType
class Wckg(object):
pass
如您所见, from wckg_api.py
,它从 导入RelType
,__init__
同时它 wckg_api
从 from导入wckg.api.py
以创建Wckg
对象。这是循环的,它报告一个错误:
ImportError:无法从“wckg”(/Users/comin/nlpc/wckg/wckg/ init .py)导入名称“RelType”
有没有办法解决这个问题?init定义了接口,而 wckg_api.py 应该定义接口的实现。我不想在 wckg_api.py 中定义常量 RelType 因为我不希望用户在用户从init调用函数时导入这些常量类型。这些类型可以立即提供给用户。但是由于init还需要从 wckg_api.py 导入一些东西,它会产生这个循环导入问题。
这是一个典型的问题吗?
解决方案
我会这样解决这个问题:
wckg:
__init__.py
api/wckg_api.py
api/_rel_type.py
api/wckg_api.py:
from ._rel_type import RelType
class Wckg(object):
pass
api/_rel_type.py:
class RelType(Enum):
a = 1
b = 2
和下__init__.py
:
from wckg.api import wckg_api, RelType
WCKG = wckg_api.Wckg()