Commit 7a3602e7 authored by Raymond Hettinger's avatar Raymond Hettinger

Issue #24931: Resolve __dict__ conflict in namedtuple subclasses.

parent 1a837464
...@@ -816,10 +816,10 @@ field names, the method and attribute names start with an underscore. ...@@ -816,10 +816,10 @@ field names, the method and attribute names start with an underscore.
.. method:: somenamedtuple._asdict() .. method:: somenamedtuple._asdict()
Return a new :class:`OrderedDict` which maps field names to their corresponding Return a new :class:`OrderedDict` which maps field names to their corresponding
values. Note, this method is no longer needed now that the same effect can values::
be achieved by using the built-in :func:`vars` function::
>>> vars(p) >>> p = Point(x=11, y=22)
>>> p._asdict()
OrderedDict([('x', 11), ('y', 22)]) OrderedDict([('x', 11), ('y', 22)])
.. versionchanged:: 3.1 .. versionchanged:: 3.1
......
...@@ -272,23 +272,14 @@ class {typename}(tuple): ...@@ -272,23 +272,14 @@ class {typename}(tuple):
'Return a nicely formatted representation string' 'Return a nicely formatted representation string'
return self.__class__.__name__ + '({repr_fmt})' % self return self.__class__.__name__ + '({repr_fmt})' % self
@property
def __dict__(self):
'A new OrderedDict mapping field names to their values'
return OrderedDict(zip(self._fields, self))
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 self.__dict__ return OrderedDict(zip(self._fields, self))
def __getnewargs__(self): def __getnewargs__(self):
'Return self as a plain tuple. Used by copy and pickle.' 'Return self as a plain tuple. Used by copy and pickle.'
return tuple(self) return tuple(self)
def __getstate__(self):
'Exclude the OrderedDict from pickling'
return None
{field_defs} {field_defs}
""" """
......
...@@ -225,7 +225,6 @@ class TestNamedTuple(unittest.TestCase): ...@@ -225,7 +225,6 @@ class TestNamedTuple(unittest.TestCase):
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)
...@@ -380,6 +379,17 @@ class TestNamedTuple(unittest.TestCase): ...@@ -380,6 +379,17 @@ class TestNamedTuple(unittest.TestCase):
globals().pop('NTColor', None) # clean-up after this test globals().pop('NTColor', None) # clean-up after this test
def test_namedtuple_subclass_issue_24931(self):
class Point(namedtuple('_Point', ['x', 'y'])):
pass
a = Point(3, 4)
self.assertEqual(a._asdict(), OrderedDict([('x', 3), ('y', 4)]))
a.w = 5
self.assertEqual(a.__dict__, {'w': 5})
################################################################################ ################################################################################
### Abstract Base Classes ### Abstract Base Classes
################################################################################ ################################################################################
......
...@@ -78,6 +78,10 @@ Library ...@@ -78,6 +78,10 @@ Library
- Issue #21112: Fix regression in unittest.expectedFailure on subclasses. - Issue #21112: Fix regression in unittest.expectedFailure on subclasses.
Patch from Berker Peksag. Patch from Berker Peksag.
- Issue #24931: Instances of subclasses of namedtuples have their own __dict__
which breaks the inherited __dict__ property and breaks the _asdict() method.
Removed the __dict__ property to prevent the conflict and fixed _asdict().
- Issue #24764: cgi.FieldStorage.read_multi() now ignores the Content-Length - Issue #24764: cgi.FieldStorage.read_multi() now ignores the Content-Length
header in part headers. Patch written by Peter Landry and reviewed by Pierre header in part headers. Patch written by Peter Landry and reviewed by Pierre
Quentel. Quentel.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment