A declarative collection of named fields.
Forms behave like flatland.Dict, but are defined with Python class syntax:
>>> from flatland import Form, String >>> class HelloForm(Form): ... hello = String ... world = String ...
Fields are assigned names from the declaration. If a named schema is used, a renamed copy will be assigned to the Form.
>>> class HelloForm(Form): ... hello = String.named('hello') # redundant ... world = String.named('goodbye') # will be renamed 'world' ... >>> form = HelloForm() >>> sorted(form.keys()) [u'hello', u'world']
Forms may embed other container fields and other forms:
>>> from flatland import List >>> class BigForm(Form): ... main_hello = HelloForm ... alt_hello = List.of(String.named('alt_name'), ... HelloForm.named('alt_hello')) ...
This would create a form with one HelloForm embedded as main_hello, and a list of zero or more dicts, each containing an alt_name and another HelloForm named alt_hello.
Forms may inherit from other Forms or Dicts. Field declared in a subclass will override those of a superclass. Multiple inheritance is supported.
The special behavior of Form is limited to class construction time only. After construction, the Form acts exactly like a Dict. In particular, fields declared in class attribute style do not remain class attributes. They are removed from the class dictionary and placed in the field_schema:
>>> hasattr(HelloForm, 'hello') False >>> sorted([field.name for field in HelloForm.field_schema]) [u'hello', u'world']
The order of field_schema after construction is undefined.