Last active
November 13, 2015 15:47
-
-
Save jcdyer/f33fdf8435ba23346870 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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