私は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) の 2 番目の引数は、circbuf の行番号を参照しています。アサーションを含むinit docstring:
def __init__(self, leng):
"""Construct an empty circular buffer.
pre::
leng > 0
post[self]::
self.is_empty() and len(self.buf) == leng
"""
ただし、ファイルを開いて docstring の行番号を数えなければならないのは面倒です。どの契約が失敗したかを特定するためのより迅速な解決策を誰かが持っていますか?
(この例では前提条件が 1 つであるため、明らかですが、複数の前提条件が可能であることに注意してください)。