在主Python模块中调用isinstance

Dmi*_* K. 6 python

如果在__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.

Hel*_*hne 6

WSo运行时会发生什么a.py,Python会读取a.py并执行它.在执行此操作时,它会导入模块b,它导入模块a,但它不会重复使用先前解析它的定义.所以,现在你有内部定义的两个副本a.py,被称为模块__main__a,因此不同的__main__.Aa.A.

通常,您应该避免导入正在执行的模块.相反,您可以创建一个新文件来运行doctests并使用类似的东西

import a
import doctest

doctest.testmod(a)
Run Code Online (Sandbox Code Playgroud)

__main__从模块中删除该部件a.