我正在玩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
"""
然而,這是一個痛苦打開的文件和計數的文檔字符串的行號。有沒有人有更快的解決方案來確定哪個合同失敗? (請注意,在這個例子中,有一個單一的前提條件,所以很明顯,但是可能有多個前提條件)。