我正在编写一个 python 包(python 3.6)并具有以下目录结构:
package/
| __init__.py
| fileA.py
| fileB.py
| tests/
| | __init__.py
| | test_classA.py
| | test_classB.py
设置
我的文件有以下内容:
# package/fileA.py
from package import ClassB
def ClassA:
def __init__(self):
self.my_ClassB = ClassB()
-
# package/fileB.py
def ClassB:
def __init__(self):
self.foo = "bar"
-
# package/tests/test_classB.py
from package import ClassB
# <performs some unit tests here>
-
# package/tests/test_classA.py
from package import ClassA
# <performs some unit tests here>
-
# package/__init__.py
from .fileA import ClassA
from .fileB import ClassB
循环导入
当我运行 python test_classB.py
时,我收到以下回溯错误,表明我有循环导入语句,这是 python 不允许的。注意 - 该包的字面意思不是 package
,我已经编辑了 Traceback 以匹配上面的玩具示例。
Traceback (most recent call last):
File "package/tests/test_classB.py", line 2, in <module>
from package import ClassB
File "/anaconda/lib/python3.5/site-packages/package/__init__.py", line 2, in <module>
from .fileA import ClassA
File "/anaconda/lib/python3.5/site-packages/package/merparse.py", line 2, in <module>
from package import ClassB
ImportError: cannot import name 'ClassB'
更正错误
但是,当我在 package/__init__.py
文件中删除这两行时:
# package/__init__.py
from .fileA import ClassA
from .fileB import ClassB
...我更改了package/fileA.py
的导入方法:
# package/fileA.py
from package.fileB import ClassB
def ClassA:
def __init__(self):
self.my_ClassB = ClassB()
... package/tests/test_classB.py
正确运行。
我的问题
我的问题是:如何在我的文件中保留一个文件:一个类结构并使用 from package import ClassA
导入,而不是必须使用 from package.fileA import ClassA 导入
?
在我的包中,我想从其他文件导入类,但不知道如何绕过循环导入。
编辑:解
感谢下方的@mirandak 和@martin-kalcok 的帮助。
我必须编辑的唯一文件是 fileA.py
,以便不在导入语句中引用包名称。
# package/fileA.py
from .fileB import ClassB
def ClassA:
def __init__(self):
self.my_ClassB = ClassB()
package/__init__.py
文件仍然包含 import 语句,以防将来我想从不与包耦合的其他脚本导入包。
# package/__init__.py
from .fileA import ClassA
from .fileB import ClassB
最佳答案
问题出在 package/fileA.py
上。它既是 package
的一部分,又在导入时调用 package
的 __init__.py
文件 - 创建循环依赖。
你能把 fileA.py
改成这样吗?
# package/fileA.py
from .fileB import ClassB
def ClassA:
def __init__(self):
self.my_ClassB = ClassB()
关于python - 在 python 包中使用另一个文件中的类并在 __init__() 中发生冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38985042/