Skip to content

Commit bedfbc7

Browse files
bpo-36321: Fix misspelled attribute in namedtuple() (GH-12375) (GH-12395)
(cherry picked from commit 23581c0) Co-authored-by: Raymond Hettinger <[email protected]>
1 parent 76ff715 commit bedfbc7

File tree

4 files changed

+15
-8
lines changed

4 files changed

+15
-8
lines changed

Doc/library/collections.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -941,14 +941,14 @@ field names, the method and attribute names start with an underscore.
941941
>>> Pixel(11, 22, 128, 255, 0)
942942
Pixel(x=11, y=22, red=128, green=255, blue=0)
943943

944-
.. attribute:: somenamedtuple._fields_defaults
944+
.. attribute:: somenamedtuple._field_defaults
945945

946946
Dictionary mapping field names to default values.
947947

948948
.. doctest::
949949

950950
>>> Account = namedtuple('Account', ['type', 'balance'], defaults=[0])
951-
>>> Account._fields_defaults
951+
>>> Account._field_defaults
952952
{'balance': 0}
953953
>>> Account('premium')
954954
Account(type='premium', balance=0)

Lib/collections/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,8 @@ def __getnewargs__(self):
443443
'__doc__': f'{typename}({arg_list})',
444444
'__slots__': (),
445445
'_fields': field_names,
446+
'_field_defaults': field_defaults,
447+
# alternate spelling for backward compatiblity
446448
'_fields_defaults': field_defaults,
447449
'__new__': __new__,
448450
'_make': _make,

Lib/test/test_collections.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -249,18 +249,18 @@ def test_factory(self):
249249

250250
def test_defaults(self):
251251
Point = namedtuple('Point', 'x y', defaults=(10, 20)) # 2 defaults
252-
self.assertEqual(Point._fields_defaults, {'x': 10, 'y': 20})
252+
self.assertEqual(Point._field_defaults, {'x': 10, 'y': 20})
253253
self.assertEqual(Point(1, 2), (1, 2))
254254
self.assertEqual(Point(1), (1, 20))
255255
self.assertEqual(Point(), (10, 20))
256256

257257
Point = namedtuple('Point', 'x y', defaults=(20,)) # 1 default
258-
self.assertEqual(Point._fields_defaults, {'y': 20})
258+
self.assertEqual(Point._field_defaults, {'y': 20})
259259
self.assertEqual(Point(1, 2), (1, 2))
260260
self.assertEqual(Point(1), (1, 20))
261261

262262
Point = namedtuple('Point', 'x y', defaults=()) # 0 defaults
263-
self.assertEqual(Point._fields_defaults, {})
263+
self.assertEqual(Point._field_defaults, {})
264264
self.assertEqual(Point(1, 2), (1, 2))
265265
with self.assertRaises(TypeError):
266266
Point(1)
@@ -277,21 +277,21 @@ def test_defaults(self):
277277
Point = namedtuple('Point', 'x y', defaults=False)
278278

279279
Point = namedtuple('Point', 'x y', defaults=None) # default is None
280-
self.assertEqual(Point._fields_defaults, {})
280+
self.assertEqual(Point._field_defaults, {})
281281
self.assertIsNone(Point.__new__.__defaults__, None)
282282
self.assertEqual(Point(10, 20), (10, 20))
283283
with self.assertRaises(TypeError): # catch too few args
284284
Point(10)
285285

286286
Point = namedtuple('Point', 'x y', defaults=[10, 20]) # allow non-tuple iterable
287-
self.assertEqual(Point._fields_defaults, {'x': 10, 'y': 20})
287+
self.assertEqual(Point._field_defaults, {'x': 10, 'y': 20})
288288
self.assertEqual(Point.__new__.__defaults__, (10, 20))
289289
self.assertEqual(Point(1, 2), (1, 2))
290290
self.assertEqual(Point(1), (1, 20))
291291
self.assertEqual(Point(), (10, 20))
292292

293293
Point = namedtuple('Point', 'x y', defaults=iter([10, 20])) # allow plain iterator
294-
self.assertEqual(Point._fields_defaults, {'x': 10, 'y': 20})
294+
self.assertEqual(Point._field_defaults, {'x': 10, 'y': 20})
295295
self.assertEqual(Point.__new__.__defaults__, (10, 20))
296296
self.assertEqual(Point(1, 2), (1, 2))
297297
self.assertEqual(Point(1), (1, 20))
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
collections.namedtuple() misspelled the name of an attribute. To be
2+
consistent with typing.NamedTuple, the attribute name should have been
3+
"_field_defaults" instead of "_fields_defaults". For backwards
4+
compatibility, both spellings are now created. The misspelled version may
5+
be removed in the future.

0 commit comments

Comments
 (0)