Я играю с 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) относится к номеру строки в цикле. init строка документа, содержащая утверждение:
def __init__(self, leng):
"""Construct an empty circular buffer.
pre::
leng > 0
post[self]::
self.is_empty() and len(self.buf) == leng
"""
Тем не менее, очень сложно открыть файл и сосчитать номера строк документации. У кого-нибудь есть более быстрое решение для определения, какой контракт потерпел неудачу?
(Обратите внимание, что в этом примере есть одно предварительное условие, поэтому оно очевидно, но возможно несколько предварительных условий).