在主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.pya中导入
执行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