我知道在大多数情况下isinstance
不需要或应该避免(例如,Isinstance pythonic/"good" 的使用吗?)。但是,有时这正是我所需要的。
然而,在 Python 2.6、2.7 和 3.2 中,我注意到 isinstance
在 doctest 中的执行和正常执行之间的工作方式存在以下不规则性。
例如,我希望出现以下行为,这isinstance
与我使用的是限定名称还是非限定名称是矛盾的:
import collections
from collections import OrderedDict
assert isinstance(collections.OrderedDict(), collections.OrderedDict) == True
assert isinstance(collections.OrderedDict(), OrderedDict) == True
在 Doctest 中执行的相同代码的工作方式相同。
但是,如果我在名为“isinstanceTest.py”的模块中定义一个类,并在isinstance
用于匹配该类的同一模块中定义一个函数,事情会变得更有趣。以下 doctest 是为了通过而编写的。我正在使用,unittest.TextTestRunner
因为我经常收集并在一个套件中跨多个模块运行我的文档测试和单元测试。
import unittest, doctest
import collections
class A: pass
def isinstance_A(arg):
'''
>>> import isinstanceTest
>>> isinstanceTest.isinstance_A(isinstanceTest.A())
True
>>> isinstance_A(A())
True
>>> isinstanceTest.isinstance_A(A())
False
>>> isinstance_A(isinstanceTest.A())
False
'''
return isinstance(arg, A)
if __name__ == '__main__':
l = doctest.DocTestSuite(__name__)
runner = unittest.TextTestRunner()
runner.run(l)
请注意,最后两个 doctest 语句同时使用了限定名称和非限定名称,会产生意想不到的结果。
如果在“isinstanceTest.py”所在的目录中,我打开一个解释器并执行等效命令,结果如预期:
Python 3.2.3 (default, May 3 2012, 15:51:42)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import isinstanceTest
>>> from isinstanceTest import *
>>> isinstanceTest.isinstance_A(isinstanceTest.A())
True
>>> isinstance_A(A())
True
>>> isinstanceTest.isinstance_A(A())
True
>>> isinstance_A(isinstanceTest.A())
True
因此,虽然这种行为是一致的并且本地化为在测试套件中运行 doctest(并且我已经根据需要对其进行了编码,并且通常只在 doctests 中使用限定名称),但更大的问题是:这是 doctests 的记录限制吗(我有还没有找到任何提到这一点的文档),或者这是一个错误?