gpt4 book ai didi

python - 在 python 包中使用另一个文件中的类并在 __init__() 中发生冲突

转载 作者:太空宇宙 更新时间:2023-11-04 10:09:56 26 4
gpt4 key购买 nike

我正在编写一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com