How do I know which contract failed with Python's contract.py?
I'm playing with [contract.py][1], Terrence Way's reference implementation of design-by-contract for Python. The implementation throws an exception when a contract (precondition/postcondition/invariant) is violated, but it doesn't provide you a quick way of identifying which specific contract has failed if there are multiple ones associated with a method. 

For example, if I take the [circbuf.py][2] example, and violate the precondition by passing in a negative argument, like so: 

    circbuf(-5)

Then I get a traceback that looks like this:


    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)


My hunch is that the second argument in the PreconditionViolationError (4) refers to the line number in the circbuf.__init__ docstring that contains the assertion:

    def __init__(self, leng):
        """Construct an empty circular buffer.
    
        pre::
            leng > 0
        post[self]::
            self.is_empty() and len(self.buf) == leng
        """

However, it's a pain to have to open the file and count the docstring line numbers. Does anybody have a quicker solution for identifying which contract has failed? 

(Note that in this example, there's a single precondition, so it's obvious, but multiple preconditions are possible).




  [1]: http://www.wayforward.net/pycontract/
  [2]: http://www.wayforward.net/pycontract/examples/circbuf.py



How do I know which contract failed with Python's contract.py?
===

I'm playing with [contract.py][1], Terrence Way's reference implementation of design-by-contract for Python. The implementation throws an exception when a contract (precondition/postcondition/invariant) is violated, but it doesn't provide you a quick way of identifying which specific contract has failed if there are multiple ones associated with a method. 

For example, if I take the [circbuf.py][2] example, and violate the precondition by passing in a negative argument, like so: 

    circbuf(-5)

Then I get a traceback that looks like this:


    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)


My hunch is that the second argument in the PreconditionViolationError (4) refers to the line number in the circbuf.__init__ docstring that contains the assertion:

    def __init__(self, leng):
        """Construct an empty circular buffer.
    
        pre::
            leng > 0
        post[self]::
            self.is_empty() and len(self.buf) == leng
        """

However, it's a pain to have to open the file and count the docstring line numbers. Does anybody have a quicker solution for identifying which contract has failed? 

(Note that in this example, there's a single precondition, so it's obvious, but multiple preconditions are possible).




  [1]: http://www.wayforward.net/pycontract/
  [2]: http://www.wayforward.net/pycontract/examples/circbuf.py


