Skip to content

Instantly share code, notes, and snippets.

@impredicative
Last active April 15, 2017 00:13
Show Gist options
  • Save impredicative/79338614f9c5a92bf514eb98075fdbee to your computer and use it in GitHub Desktop.
Save impredicative/79338614f9c5a92bf514eb98075fdbee to your computer and use it in GitHub Desktop.
Default collections namedtuple
from collections import namedtuple # pylint: disable=import-self
def default_namedtuple(typename='Case', **defaults):
NamedTuple = namedtuple(typename, defaults) # pylint: disable=invalid-name
default_tuple = NamedTuple(**defaults)
customizable_tuple = default_tuple._replace
return customizable_tuple
import unittest
class TestDefaultNamedTuple(unittest.TestCase):
def test_default_typename(self):
default = default_namedtuple(foo='a')
custom = default()
actual_typename = type(custom).__name__
self.assertEqual(actual_typename, 'Case')
def test_default_values(self):
default = default_namedtuple('Foo', bar='a', baz=1)
custom = default()
actual_typename = type(custom).__name__
self.assertEqual(actual_typename, 'Foo')
self.assertEqual(custom.bar, 'a')
self.assertEqual(custom.baz, 1)
def test_custom_values(self):
default = default_namedtuple('Foo', bar='a', baz=1, qux=False)
custom = default(baz=2, qux=True)
self.assertEqual(custom.bar, 'a')
self.assertEqual(custom.baz, 2)
self.assertTrue(custom.qux)
def test_default_values_persistence(self):
default = default_namedtuple(foo='a', bar=1)
custom1 = default(foo='b', bar=2)
custom2 = default(foo='c')
self.assertEqual(custom1.foo, 'b')
self.assertEqual(custom1.bar, 2)
self.assertEqual(custom2.foo, 'c')
self.assertEqual(custom2.bar, 1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment