fields¶
How it works: the library is composed of 2 major parts:
- The sealers. They return a class that implements a container according the given specification (list of field names and default values).
- The factory. A metaclass that implements attribute/item access, so you can do
Fields.a.b.c. On each getattr/getitem it returns a new instance with the new state. Its__new__method takes extra arguments to store the contruction state and it works in two ways:- Construction phase (there are no bases). Make new instances of the Factory with new state.
- Usage phase. When subclassed (there are bases) it will use the sealer to return the final class.
-
fields.factory(sealer, **sealer_options)[source]¶ Create a factory that will produce a class using the given
sealer.Parameters: - sealer (func) –
A function that takes
fields, defaultsas arguments, where:- fields (list): A list with all the field names in the declared order.
- defaults (dict): A dict with all the defaults.
- sealer_options – Optional keyword arguments passed to
sealer.
Returns: A class on which you can do .field1.field2.field3…. When it’s subclassed it “seals”, and whatever the
sealerreturned for the given fields is used as the baseclass.Example:
>>> def sealer(fields, defaults): ... print("Creating class with:") ... print(" fields = {0}".format(fields)) ... print(" defaults = {0}".format(defaults)) ... return object ... >>> Fields = factory(sealer) >>> class Foo(Fields.foo.bar.lorem[1].ipsum[2]): ... pass ... Creating class with: fields = ['foo', 'bar', 'lorem', 'ipsum'] defaults = OrderedDict([('lorem', 1), ('ipsum', 2)]) >>> Foo <class '...Foo'> >>> Foo.__bases__ (<... 'object'>,)
- sealer (func) –
-
fields.class_sealer(fields, defaults, base=<class 'fields.__base__'>, make_init_func=<function make_init_func>, initializer=True, comparable=True, printable=True, convertible=False, pass_kwargs=False)[source]¶ This sealer makes a normal container class. It’s mutable and supports arguments with default values.
-
fields.slots_class_sealer(fields, defaults)[source]¶ This sealer makes a container class that uses
__slots__(it usesclass_sealer()internally).The resulting class has a metaclass that forcibly sets
__slots__on subclasses.
-
class
fields.Fields¶ Container class generator. The resulting class will implement
__repr__,__init__,__eq__,__ne__,__lt__,__gt__,__le__,__ge__and__hash__.Usage:
class Foobar(Fields.foo.bar): pass
-
class
fields.BareFields¶ Container class generator. The resulting class will implement
__init__.Usage:
class Foobar(BareFields.foo.bar): pass
-
class
fields.PrintableMixin¶ Container class generator. The resulting class will implement
__repr__.Usage:
class Foobar(PrintableMixin.foo.bar): # we need to have the `foo` and `bar` attributes foo = None bar = None
-
class
fields.ComparableMixin¶ Container class generator. The resulting class will implement
__eq__,__ne__,__lt__,__gt__,__le__,__ge__and__hash__.Usage:
class Foobar(BareFields.name.extra, ComparableMixin.name): """ A class that only compares on `name` but has an `extra` field. """ pass