【发布时间】:2018-12-06 19:19:29
【问题描述】:
在隔离了一个错误几个小时后,我提出了以下 MCVE 示例来演示我遇到的问题:
a.py:
from b import get_foo_indirectly
class Foo:
pass
if __name__ == '__main__':
print("Indirect:", isinstance(get_foo_indirectly(), Foo))
print("Direct:", isinstance(Foo(), Foo))
b.py:
def get_foo_indirectly():
from a import Foo
return Foo()
a.py 的预期输出为:
Indirect: True
Direct: True
实际输出为:
Indirect: False
Direct: True
另外,如果我创建一个单独的模块c.py,输出如预期:
from a import Foo
from b import get_foo_indirectly
if __name__ == '__main__':
print("Indirect:", isinstance(get_foo_indirectly(), Foo))
print("Direct:", isinstance(Foo(), Foo))
很明显,isinstance 和导入机制之间的交互行为并不像我预期的那样。似乎循环进口的使用让我很难受。为什么?这是 Python 的预期行为吗?
请注意,这对我遇到此行为的实际上下文过于简单了;模块 a 和 b 都是大模块,而 b 是分开的,因为它与 a 有不同的用途。既然我已经看到了循环导入的后果,我可能会将它们结合起来,也许会降低 b 中的一些冗长的行为。
【问题讨论】:
-
@ehacinom 因为循环导入的性质(虽然我显然不完全理解);如果同时在
b中导入a和在a中的b,则会出现错误:ImportError: cannot import name 'get_foo_indirectly' from 'b' -
如果您在
a.py中打印出Foo(),您将得到__main__.Foo instance。如果你在b.py中打印出Foo(),你会得到a.Foo instance -
@John 很好的发现。但是,我的示例更简洁,并提出了更一般的问题。我不确定是否值得将其标记为重复(尽管如果您感觉不同,您和其他任何人当然可以标记并投票关闭作为重复。)
标签: python python-3.x