python - 使用 Python 导入的无限循环;寻找 Pythonic 方式

标签 python architecture import infinite-loop

我的团队正在使用 Django 开展大型项目。为了简单起见,这里使用简单的 Python 来说明问题(原始问题有模型和应用程序而不是类(我知道它们都是类)和包(我知道它们也是包))。

a.py:

from b import B1


class A1(object):
    def __init__(self):
        print "object A1"


class A2(object):
    def __init__(self):
        print "object A2"


A1()
B1()

b.py:

from a import A2


class B1(object):
    def __init__(self):
        print "object B1"


A2()

a.py 被调用时,它会尝试从 b 包中导入 B1,而另一方面,它会尝试导入 < em>A2 来自 a 包,然后从头开始,永远重复。 Python 说:

[dagrevis@localhost recursion]$ python2 a.py
Traceback (most recent call last):
  File "a.py", line 1, in <module>
    from b import B1
  File "/home/dagrevis/Python/recursion/b.py", line 1, in <module>
    from a import A2
  File "/home/dagrevis/Python/recursion/a.py", line 1, in <module>
    from b import B1
ImportError: cannot import name B1

解决方案之一是每个对象一个文件。像 C++ 或 Java 这样的东西。然后我想起了 Guido 对 Python 的评价:“不要用 Python 编写 Java(或 C++,或 Javascript,...)。”。有没有更多 Pythonic 的方法来处理这个问题?

感谢任何建议!

最佳答案

您的用例不是“可解决的”。您可以将 ImportError 转换为 AttributeError 导入模块 a(和 b)而不是导入对象,但这不会改变您将无法使用这些模块的事实。

问题是你的模块 a 需要在导入前完全执行 b ,而且 b 还需要 a 在被导入之前完全执行。

这根本不可能解决,这是一个明显的症状,需要重构:你的 ab 模块应该是一个单一的模块(或者你可能想要做一些更深层次的重构)。

编辑: 实际上你可以解决这个问题,即使我认为这样做很丑陋,在需要时将导入放在文件末尾。 但我认为这只是一些更大问题的补丁。

关于python - 使用 Python 导入的无限循环;寻找 Pythonic 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12474374/

相关文章:

asp.net - 模块化软件设计

python - 带有 while 循环的销售税计算器

python - 读写特定内容

python - SQLalchemy "load_only"不只加载指定的列

java - 如何在多个 PU 之间最好地共享实体类/DAO?

c# - 数据提供者与存储库

mysql - 将 CSV 文件导入 MySql 表,其中一列作为 CSV 文件的名称

java - Java 中的嵌套包

python - 模块未找到错误 : No module named 'lib'

python - 异步处理数组中的多个文件 - Python