python的教义很酷。让我从一个简单的例子开始:

def foo():
  """
  >>> foo()
  hello world
  """
  print "hello world"

现在让我们假设一些部分有些变化,例如,因为它是一个时间值或一个随机数。通常,doctests允许我使用+省略号选项指定一个通配符。
例如,当“world”是一个变化的字符串时,这种方法可以很好地工作:
def foo():
  """
  >>> foo()   # doctest: +ELLIPSIS
  hello ...
  """
  print "hello world"

然而,在我的例子中,变量字符串位于行的开头:
def foo():
  """
  >>> foo() # doctest: +ELLIPSIS
  ... world
  """
  print "hello world"

这是错误的,因为开头的3个点被解释为行连续字符,而不是输出的省略号。因此,此测试失败:
Failed example:
    foo() # doctest: +ELLIPSIS
    world
Expected nothing
Got:
    hello world

所以,我现在可以重写我的函数,把变量部分放在其他地方,但是有什么方法可以教doctest一行开头的3个点是省略号吗?

最佳答案

下面是一个快速而肮脏的黑客:

def foo():
    """
    >>> foo() # doctest: +ELLIPSIS
    [...] world
    """
    print "hello world"

if __name__ == "__main__":
    import doctest

    OC = doctest.OutputChecker
    class AEOutputChecker(OC):
        def check_output(self, want, got, optionflags):
            from re import sub
            if optionflags & doctest.ELLIPSIS:
                want = sub(r'\[\.\.\.\]', '...', want)
            return OC.check_output(self, want, got, optionflags)

    doctest.OutputChecker = AEOutputChecker
    doctest.testmod()

这仍然理解正常(…)省略号,但它添加了一个新的([…]),不会增加行开始模糊性。
对于doctest来说,很难猜测是否有一个行继续被挂起,或者它的一个行开始省略号——理论上,如果您将doctestparser子类化来完成这项工作,就可以完成,但这可能不会很有趣。
在复杂的情况下,您可能应该滚动自己的doctestrunner,使用新的outputchecker,并使用它而不是普通的testmod,但在简单的情况下应该这样做。

关于python - 我可以在Python doctest的行尾添加省略号吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5812833/

10-12 12:57