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/