【发布时间】:2009-06-19 13:35:32
【问题描述】:
我正在使用 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.init 文档字符串中的行号:
def __init__(self, leng):
"""Construct an empty circular buffer.
pre::
leng > 0
post[self]::
self.is_empty() and len(self.buf) == leng
"""
但是,必须打开文件并计算文档字符串的行号是一件很痛苦的事情。有没有人有更快的解决方案来确定哪个合同失败了?
(请注意,在此示例中,只有一个前提条件,因此很明显,但可能有多个前提条件)。
【问题讨论】: