如果在__main__太空中使用,则存在奇怪的异常行为.
请考虑以下代码
a.py:
class A(object):
pass
if __name__ == "__main__":
from b import B
b = B()
print(isinstance(b, A))
Run Code Online (Sandbox Code Playgroud)
b.py
from a import A
class B(A):
pass
Run Code Online (Sandbox Code Playgroud)
main.py
from a import A
from b import B
b = B()
print(isinstance(b, A))
Run Code Online (Sandbox Code Playgroud)
当我跑步时main.py,我得到了True,正如预期的那样,但是当我跑步时a.py,我正在接受False.它看起来像是在那里A获得前缀的名称__main__.
我怎样才能获得一致的行为?我需要这个技巧导入Bin a.py来运行doctest文件a.py.
WSo运行时会发生什么a.py,Python会读取a.py并执行它.在执行此操作时,它会导入模块b,它导入模块a,但它不会重复使用先前解析它的定义.所以,现在你有内部定义的两个副本a.py,被称为模块__main__和a,因此不同的__main__.A和a.A.
通常,您应该避免导入正在执行的模块.相反,您可以创建一个新文件来运行doctests并使用类似的东西
import a
import doctest
doctest.testmod(a)
Run Code Online (Sandbox Code Playgroud)
并__main__从模块中删除该部件a.