$ pip install typedtuple
from typedtuple import typedtuple
# definition dictionary is converted to voluptuous.Schema(definition_dict, required=True)
Vector = typedtuple('Vector', {'x': float, 'y': float, 'z': float})
v0 = Vector(x=10.0, y=20.0, z=30.0)
print v0.x # 10.0
v1 = Vector(x=10, y=20) # raises exception
from voluptuous import Schema
# can use voluptuous.Schema as definition
Vector = typedtuple('Vector', Schema({'x': float, 'y': float, 'z': float}, required=True))
from math import sqrt
from typedtuple import schema
@schema({'x': float, 'y': float, 'z': float})
class Vector(object):
@property
def length(self):
return sqrt(pow(self.x, 2.0) + pow(self.y, 2.0) + pow(self.z, 2.0))
v = Vector(x=1.0, y=2.0, z=2.0)
print v.length # 3.0
from voluptuous import Coerce
from typedtuple import schema
@schema({'x': Coerce(float), 'y': Coerce(float)})
class Vector(object):
pass
v0 = Vector(x=10, y='20.0')
print v0.x # 10.0
print v0.y # 20.0
from collections import OrderedDict
from typedtuple import schema
@schema(OrderedDict((('x', float), ('y', float), ('z', float))))
class Vector(object):
pass
print Vector._fields # ('x', 'y', 'z')
TypedTuple is tuple. so...
from collections import OrderedDict
from typedtuple import typedtuple
Vector0 = typedtuple('Vector0', OrderedDict((('x', float), ('y', float))))
Vector1 = typedtuple('Vector1', OrderedDict((('y', float), ('x', float))))
v0 = Vector0(x=10.0, y=20.0)
v1 = Vector1(x=20.0, y=10.0)
v0 == v1 # True
use nose for test
benchmark