我正在玩contract.py,这是Terrence Way为Python设计的合同的参考实现。当违反合同(先决条件/后置条件/不变条件)时,实现会抛出异常,但如果存在多个与方法关联的合约,则无法快速识别哪个特定合同失败。我如何知道Python的contract.py失败?
例如,如果我走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
"""
然而,这是一个痛苦打开的文件和计数的文档字符串的行号。有没有人有更快的解决方案来确定哪个合同失败? (请注意,在这个例子中,有一个单一的前提条件,所以很明显,但是可能有多个前提条件)。