Welcome, guest | Sign In | My Account | Store | Cart

Notice! PyPM is being replaced with the ActiveState Platform, which enhances PyPM’s build and deploy capabilities. Create your free Platform account to download ActivePython or customize Python with the packages you require and get automatic updates.


pycontract is unavailable in PyPM, because there aren't any builds for it in the package repositories. Click the linked icons to find out why.

 Python 2.7Python 3.2Python 3.3
Windows (32-bit)
0.1.4 Failed View build log
Windows (64-bit)
0.1.4 Failed View build log
Mac OS X (10.5+)
0.1.4 Failed View build log
Linux (32-bit)
0.1.4 Failed View build log
Linux (64-bit)
0.1.4 Failed View build log
Lastest release
version 0.1.4 on Jan 5th, 2011

A declarative data contract container type for Python

Pycontracts is currently an internal alpha and not ready for production use.

Python data contracts (pycontracts in PyPi) is a library for exchanging data between systems. It is loosely based on the django forms api to help ease adoption. A simple example:

from pycontract import DataContract, StringField, NumberField

class Person(DataContract):
    name = StringField()
    phone = StringField(null=True)
    age = NumberField(null=True)

bob = Person()
bob["name"] = "Bob Smith"
bob["phone"] = "999-555-1234"
bob["age"] = 32

In this example the contract for person is declared and the record for bob is instantiated. In addition to the basic data we can add processors which manipulate or clean the data as well as validators which validate the data similar to django validators.

  • Customizable validation (compatible with django validators).
  • Data processors to clean up and format data.
  • Declarative field definitions.
  • Enforced value assignment helps avoid regression errors.
  • Licensed under the MIT License.

Basic Usage

The first step is define a basic contract. This is done by inheriting from pycontract.DataContract. Next we decide if there is standard processing that is needed for each field. For example we could use the strip_white_space processor to call pythons strip on each value. Finally we decide if there is any extra validation that is needed on the values. For example to ensure that the persons name starts with an "a" we could use the RegexValidator. So with this information we would declare this DataContract like this:

from pycontract import DataContract, StringField, NumberField, strip_white_space, RegexValidator

class Person(DataContract):
    name = StringField(processors=(strip_white_space,), validators=(RegexValidator(r"[aA].+"),))
    phone = StringField(null=True)
    age = NumberField(null=True)

Now at runtime we can set the values, check for a valid contract and finally access the values. That would like something like this:

>>> manny = Person()
>>> manny["name"] = "Angel Man "
>>> manny["phone"] = "999555-1234"
>>> manny["age"] = 22
>>> manny.is_valid()
>>> print manny.name
'Angel Man'

This is early release and the code base is very short, so for more information see the code. The source code can be found at github.

Subscribe to package updates

Last updated Jan 5th, 2011

What does the lock icon mean?

Builds marked with a lock icon are only available via PyPM to users with a current ActivePython Business Edition subscription.

Need custom builds or support?

ActivePython Enterprise Edition guarantees priority access to technical support, indemnification, expert consulting and quality-assured language builds.

Plan on re-distributing ActivePython?

Get re-distribution rights and eliminate legal risks with ActivePython OEM Edition.