我正在玩contract.py,Terrence Way 的 Python 合同设计参考实现。当违反合同(前置条件/后置条件/不变量)时,实现会引发异常,但如果有多个与方法关联的合同,它不会为您提供快速识别哪个特定合同失败的方法。
例如,如果我以circbuf.py为例,并通过传入否定参数来违反前提条件,如下所示:
circbuf(-5)
然后我得到一个看起来像这样的回溯:
Traceback (most recent call last):
File "circbuf.py", line 115, in <module>
circbuf(-5)
File "<string>", line 3, in __assert_circbuf___init___chk
File "build/bdist.macosx-10.5-i386/egg/contract.py", line 1204, in call_constructor_all
File "build/bdist.macosx-10.5-i386/egg/contract.py", line 1293, in _method_call_all
File "build/bdist.macosx-10.5-i386/egg/contract.py", line 1332, in _call_all
File "build/bdist.macosx-10.5-i386/egg/contract.py", line 1371, in _check_preconditions
contract.PreconditionViolationError: ('__main__.circbuf.__init__', 4)
我的预感是 PreconditionViolationError (4) 中的第二个参数是指 circbuf 中的行号。包含断言的初始化文档字符串:
def __init__(self, leng):
"""Construct an empty circular buffer.
pre::
leng > 0
post[self]::
self.is_empty() and len(self.buf) == leng
"""
但是,必须打开文件并计算文档字符串的行号是一件很痛苦的事情。有没有人有更快的解决方案来确定哪个合同失败了?
(请注意,在这个例子中,有一个前提条件,所以很明显,但多个前提条件是可能的)。