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.

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.