Je joue avec contract.py, l'implémentation de référence de Terrence Way de design-by-contract pour Python. L'implémentation génère une exception lorsqu'un contrat (précondition/postcondition/invariant) est violé, mais il ne vous fournit pas un moyen rapide d'identifier quel contrat spécifique a échoué s'il y en a plusieurs associés à une méthode.Comment savoir quel contrat a échoué avec contract.py de Python?
Par exemple, si je prends l'exemple circbuf.py, et viole la condition sine qua non en passant dans un argument négatif, comme ceci:
circbuf(-5)
Puis-je obtenir un retraçage qui ressemble à ceci:
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)
Mon intuition est que le deuxième argument dans PreconditionViolationError (4) se réfère au numéro de ligne dans le circbuf. init de docstring qui contient l'affirmation:
def __init__(self, leng):
"""Construct an empty circular buffer.
pre::
leng > 0
post[self]::
self.is_empty() and len(self.buf) == leng
"""
Cependant, il est une douleur d'avoir à ouvrir le fichier et compter les numéros de ligne docstring. Quelqu'un a-t-il une solution plus rapide pour identifier quel contrat a échoué?
(Notez que dans cet exemple, il y a une seule condition préalable, donc c'est évident, mais plusieurs conditions préalables sont possibles).