在主Python模块中调用isinstance

在主Python模块中调用isinstance,python,Python,如果在\uuu main\uuu空间中使用,则会出现异常的isinstance行为 考虑以下代码 a、 py: b、 派克 main.py from a import A from b import B b = B() print(isinstance(b, A)) 当我运行main.py时,我得到了预期的True,但当我运行a.py时,我得到了False。看起来A的名称在那里得到了前缀\uuuu main\uuuu 我怎样才能获得一致的行为? 我需要在a.py中导入B以在文件a.py上运行

如果在
\uuu main\uuu
空间中使用,则会出现异常的isinstance行为

考虑以下代码

a、 py:

b、 派克

main.py

from a import A
from b import B

b = B()
print(isinstance(b, A))
当我运行
main.py
时,我得到了预期的
True
,但当我运行
a.py
时,我得到了
False
。看起来
A
的名称在那里得到了前缀
\uuuu main\uuuu

我怎样才能获得一致的行为?
我需要在
a.py
中导入
B
以在文件
a.py

上运行
doctest
的这个技巧,所以当运行
a.py
时,Python读取
a.py
并执行它。执行此操作时,它会导入模块
b
,这会导入模块
a
,但不会重用前面解析模块时的定义。因此,现在在
a.py
中有两个定义副本,称为模块
\uuuu main\uuuu
a
,因此不同的
\uuu main\uuuu.a
a.a

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

import a
import doctest

doctest.testmod(a)
并从模块
a

的事件链中删除
\uuuuuuu主\uuuuu
部分:

  • 将调用a.py脚本
  • 执行
    class A
    语句,在
    \uuuuuuuuuuuuuu
    中创建
    A
    命名空间
  • b
    已导入
  • 在b.py
    a中导入
  • 执行
    class A
    语句,在
    A
    命名空间中创建
    A
    A
    命名空间中的
    A
    \uuuu main\uuuu
    名称空间,而不是由同一名称空间生成的名称空间 代码。它们是不同的对象

  • 我同意赫尔穆特的观点,即最好避免此类循环进口。但是,如果希望以最小的更改修复代码,可以执行以下操作:

    让我们重命名
    b.py
    -->
    bmodule.py
    ,这样我们就可以区分
    b
    模块和
    b
    变量(希望在您的实际代码中,这些名称已经不同):

    印刷品

    True
    
    import a
    import doctest
    
    doctest.testmod(a)
    
    class A(object):
        pass
    
    if __name__ == "__main__":
        import bmodule
        b = bmodule.B()
        print(isinstance(b, bmodule.A))
    
    True