Skip to content

Instantly share code, notes, and snippets.

@jcdyer
Last active November 13, 2015 15:47
Show Gist options
  • Save jcdyer/f33fdf8435ba23346870 to your computer and use it in GitHub Desktop.
Save jcdyer/f33fdf8435ba23346870 to your computer and use it in GitHub Desktop.
from collections import namedtuple, OrderedDict
import functools
import pytest
def typednamedtuple(name, fields):
factory = namedtuple(name, fields.keys())
@functools.wraps(factory)
def wrapper(*args, **kwargs):
for spec, arg in zip(fields.iteritems(), args):
if not isinstance(arg, spec[1]):
raise TypeError(u'{} must be of type {}'.format(arg, spec[1]))
for fieldname, value in kwargs.iteritems():
if not isinstance(value, fields[fieldname]):
raise TypeError(u'{} must be of type {}'.format(arg, fields[fieldname]))
return factory(*args, **kwargs)
return wrapper
#########################
# Example usage and tests
types = OrderedDict([
('key', basestring),
('value', object)
])
KeyValue = typednamedtuple('KeyValue', types)
def test_instantiation():
kv = KeyValue(u'types', types)
#assert isinstance(kv, KeyValue)
assert kv.key == u'types'
assert kv.value == types
def test_type_checking():
with pytest.raises(TypeError):
kv = KeyValue(43, types)
def test_named_args():
kv = KeyValue(key=u'types', value=types)
assert kv.key == u'types'
assert kv.value == types
assert kv[0] is kv.key
assert kv[1] is kv.value
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment