我知道在大多数情况下isinstance
不需要或应该避免(例如Is this use of isinstance pythonic/"good"?)。但是,有时这是我需要的。
然而,在Python 2.6,2.7和3.2中,我注意到isinstance
在doctests和正常执行中的执行之间的工作方式存在以下不规则性。
例如,我期望以下行为,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
,因为我经常收集并在一个套件中将我的doctests和unittests一起运行在多个模块中。
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
因此,虽然此行为是一致的并且本地化为在测试套件中运行doctests(并且我已根据需要对其进行编码,并且通常仅在doctests中使用限定名称),但更大的问题是:这是doctests的文档限制(我还没有找到任何提到这个的文档),或者这是一个错误?