gpt4 book ai didi

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

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

我的团队正在使用 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/

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