Contracts for Python

Programming by Contract allows a programmer to document a function/class with statements describing behavior.

The most famous use/example of contracts is in the language Eiffel — a good introduction to programming contracts has been written by the people who wrote Eiffel.

Source Package (includes everything listed below) contract-1.4.tar.gz
23Kb; 1.4; August 31, 2007
Draft Python Enhancement Proposal (PEP) pep-0316.html
Reference Implementation contract.py
Examples sort.py
circbuf.py
Earlier versions: contract-1.3.tar.gz
23Kb; 1.3; June 02, 2007
contract-1.1.tar.gz
28Kb; 1.1; October 19, 2005
contract-1.0b3.tar.gz
27Kb; 1.0 beta 3; June 21, 2003
contract-1.0b2.tar.gz
24Kb; 1.0 beta 2; June 6, 2003
contract-1.0b1.tar.gz
19Kb; 1.0 beta 1; May 21, 2003

I believe this makes a good addition to the Python language, taking all the good features of Eiffel's contracts and making them, well, Pythonic. As an example, let's look at the contract for a sort function:

def sort(a):
 """Sort a list *IN PLACE*.
 pre:
 # must be a list
 isinstance(a, list)
 # all elements must be comparable with all other items
 forall(range(len(a)),
 lambda i: forall(range(len(a)),
 lambda j: (a[i] < a[j]) ^ (a[i] >= a[j])))
 post[a]:
 # length of array is unchanged
 len(a) == len(__old__.a)
 # all elements given are still in the array
 forall(__old__.a, lambda e: __old__.a.count(e) == a.count(e))
 # the array is sorted
 forall([a[i] >= a[i-1] for i in range(1, len(a))])
 """

sort.py

This tells us everything we need to know about sort. During debugging, these statements are actually executed. If any of the pre-conditions are false, an exception is raised so the caller can be debugged. If any of the post-conditions are false, a similar exception is raised so the sort function can be debugged.

AltStyle によって変換されたページ (->オリジナル) /