Fix named tuples to work with vars().

This commit is contained in:
Raymond Hettinger 2011-06-02 20:40:35 -07:00
parent 19b851d11b
commit 45b082935d
4 changed files with 7 additions and 2 deletions

View File

@ -623,7 +623,9 @@ Example:
'Return a new OrderedDict which maps field names to their values' 'Return a new OrderedDict which maps field names to their values'
return OrderedDict(zip(self._fields, self)) return OrderedDict(zip(self._fields, self))
<BLANKLINE> <BLANKLINE>
def _replace(_self, **kwds): __dict__ = property(_asdict)
<BLANKLINE>
def _replace(_self, **kwds):
'Return a new Point object replacing specified fields with new values' 'Return a new Point object replacing specified fields with new values'
result = _self._make(map(kwds.pop, ('x', 'y'), _self)) result = _self._make(map(kwds.pop, ('x', 'y'), _self))
if kwds: if kwds:

View File

@ -312,6 +312,7 @@ def namedtuple(typename, field_names, verbose=False, rename=False):
def _asdict(self): def _asdict(self):
'Return a new OrderedDict which maps field names to their values' 'Return a new OrderedDict which maps field names to their values'
return OrderedDict(zip(self._fields, self)) \n return OrderedDict(zip(self._fields, self)) \n
__dict__ = property(_asdict) \n
def _replace(_self, **kwds): def _replace(_self, **kwds):
'Return a new %(typename)s object replacing specified fields with new values' 'Return a new %(typename)s object replacing specified fields with new values'
result = _self._make(map(kwds.pop, %(field_names)r, _self)) result = _self._make(map(kwds.pop, %(field_names)r, _self))

View File

@ -78,12 +78,12 @@ class TestNamedTuple(unittest.TestCase):
self.assertRaises(TypeError, eval, 'Point(XXX=1, y=2)', locals()) # wrong keyword argument self.assertRaises(TypeError, eval, 'Point(XXX=1, y=2)', locals()) # wrong keyword argument
self.assertRaises(TypeError, eval, 'Point(x=1)', locals()) # missing keyword argument self.assertRaises(TypeError, eval, 'Point(x=1)', locals()) # missing keyword argument
self.assertEqual(repr(p), 'Point(x=11, y=22)') self.assertEqual(repr(p), 'Point(x=11, y=22)')
self.assertNotIn('__dict__', dir(p)) # verify instance has no dict
self.assertNotIn('__weakref__', dir(p)) self.assertNotIn('__weakref__', dir(p))
self.assertEqual(p, Point._make([11, 22])) # test _make classmethod self.assertEqual(p, Point._make([11, 22])) # test _make classmethod
self.assertEqual(p._fields, ('x', 'y')) # test _fields attribute self.assertEqual(p._fields, ('x', 'y')) # test _fields attribute
self.assertEqual(p._replace(x=1), (1, 22)) # test _replace method self.assertEqual(p._replace(x=1), (1, 22)) # test _replace method
self.assertEqual(p._asdict(), dict(x=11, y=22)) # test _asdict method self.assertEqual(p._asdict(), dict(x=11, y=22)) # test _asdict method
self.assertEqual(vars(p), p._asdict()) # verify that vars() works
try: try:
p._replace(x=1, error=2) p._replace(x=1, error=2)

View File

@ -16,6 +16,8 @@ Core and Builtins
Library Library
------- -------
- Named tuples now work correctly with vars().
- sys.setcheckinterval() now updates the current ticker count as well as updating - sys.setcheckinterval() now updates the current ticker count as well as updating
the check interval, so if the user decreases the check interval, the ticker the check interval, so if the user decreases the check interval, the ticker
doesn't have to wind down to zero from the old starting point before the new doesn't have to wind down to zero from the old starting point before the new