diff options
author | Raymond Hettinger <python@rcn.com> | 2007-12-18 23:51:15 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2007-12-18 23:51:15 (GMT) |
commit | 85dfcf35304935521085253ce5573feab21177d5 (patch) | |
tree | 4e50ffb80dba2e3b6332979fa44eb775aa14418e /Lib | |
parent | 0a8143f6462b491d3f12bfb899efd6e044e350be (diff) | |
download | cpython-85dfcf35304935521085253ce5573feab21177d5.zip cpython-85dfcf35304935521085253ce5573feab21177d5.tar.gz cpython-85dfcf35304935521085253ce5573feab21177d5.tar.bz2 |
Users demand iterable input for named tuples. The author capitulates.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/collections.py | 3 | ||||
-rw-r--r-- | Lib/test/test_collections.py | 4 |
2 files changed, 6 insertions, 1 deletions
diff --git a/Lib/collections.py b/Lib/collections.py index 3d98f7c..c6d0d0f 100644 --- a/Lib/collections.py +++ b/Lib/collections.py @@ -62,6 +62,7 @@ def namedtuple(typename, field_names, verbose=False): __slots__ = () \n def __new__(cls, %(argtxt)s): return tuple.__new__(cls, (%(argtxt)s)) \n + _cast = classmethod(tuple.__new__) \n def __repr__(self): return '%(typename)s(%(reprtxt)s)' %% self \n def _asdict(t): @@ -69,7 +70,7 @@ def namedtuple(typename, field_names, verbose=False): return {%(dicttxt)s} \n def _replace(self, **kwds): 'Return a new %(typename)s object replacing specified fields with new values' - return %(typename)s(*map(kwds.get, %(field_names)r, self)) \n + return %(typename)s._cast(map(kwds.get, %(field_names)r, self)) \n @property def _fields(self): return %(field_names)r \n\n''' % locals() diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index 73ae62a..edffbbe 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -46,6 +46,7 @@ class TestNamedTuple(unittest.TestCase): self.assertEqual(repr(p), 'Point(x=11, y=22)') self.assert_('__dict__' not in dir(p)) # verify instance has no dict self.assert_('__weakref__' not in dir(p)) + self.assertEqual(p, Point._cast([11, 22])) # test _cast classmethod self.assertEqual(p._fields, ('x', 'y')) # test _fields attribute self.assertEqual(p._replace(x=1), (1, 22)) # test _replace method self.assertEqual(p._asdict(), dict(x=11, y=22)) # test _asdict method @@ -90,12 +91,14 @@ class TestNamedTuple(unittest.TestCase): def test_odd_sizes(self): Zero = namedtuple('Zero', '') self.assertEqual(Zero(), ()) + self.assertEqual(Zero._cast([]), ()) self.assertEqual(repr(Zero()), 'Zero()') self.assertEqual(Zero()._asdict(), {}) self.assertEqual(Zero()._fields, ()) Dot = namedtuple('Dot', 'd') self.assertEqual(Dot(1), (1,)) + self.assertEqual(Dot._cast([1]), (1,)) self.assertEqual(Dot(1).d, 1) self.assertEqual(repr(Dot(1)), 'Dot(d=1)') self.assertEqual(Dot(1)._asdict(), {'d':1}) @@ -108,6 +111,7 @@ class TestNamedTuple(unittest.TestCase): Big = namedtuple('Big', names) b = Big(*range(n)) self.assertEqual(b, tuple(range(n))) + self.assertEqual(Big._cast(range(n)), tuple(range(n))) for pos, name in enumerate(names): self.assertEqual(getattr(b, name), pos) repr(b) # make sure repr() doesn't blow-up |