为什么Python doctests要求isinstance使用匹配的合格/不合格命名?

时间:2012-12-04 17:58:05

标签: python python-3.x namespaces doctest fully-qualified-naming

  

可能重复:
  Importing modules: __main__ vs import as module

我知道在大多数情况下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的文档限制(我还没有找到任何提到这个的文档),或者这是一个错误?

0 个答案:

没有答案