首页 > 解决方案 > 如何解决这个循环导入问题?

问题描述

我有一个这样的图书馆。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 导入一些东西,它会产生这个循环导入问题。

这是一个典型的问题吗?

标签: python

解决方案


我会这样解决这个问题:

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()

推荐阅读