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

标签 python python-3.x import package

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

相关文章:

python - 无法让 pytorch 与张量板一起工作

python - pandas 保留具有多个分隔符的行

python - 将 Python 源代码拆分到单独的目录中?

python - 使用 Python 多处理时执行速度较慢

Python import 头疼

python - 未找到资源点。请使用NLTK下载器获取资源: >>> import nltk >>> nltk.下载('punkt')

javascript - D3.js:使用 slider 更改导入文件

python - 如何写入最后一次出现的 loc?

python - 在 linux (pySide) 上为特定版本安装 python 模块

python - 如何修复 "Could not install packages due to an EnvironmentError: [WinError 123]"?