Skip to content

Commit 23581c0

Browse files
authored
bpo-36321: Fix misspelled attribute in namedtuple() (GH-12375)
1 parent 6a16b18 commit 23581c0

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
@@ -953,14 +953,14 @@ field names, the method and attribute names start with an underscore.
953953
>>> Pixel(11, 22, 128, 255, 0)
954954
Pixel(x=11, y=22, red=128, green=255, blue=0)
955955

956-
.. attribute:: somenamedtuple._fields_defaults
956+
.. attribute:: somenamedtuple._field_defaults
957957

958958
Dictionary mapping field names to default values.
959959

960960
.. doctest::
961961

962962
>>> Account = namedtuple('Account', ['type', 'balance'], defaults=[0])
963-
>>> Account._fields_defaults
963+
>>> Account._field_defaults
964964
{'balance': 0}
965965
>>> Account('premium')
966966
Account(type='premium', balance=0)

Lib/collections/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,8 @@ def __getnewargs__(self):
445445
'__doc__': f'{typename}({arg_list})',
446446
'__slots__': (),
447447
'_fields': field_names,
448+
'_field_defaults': field_defaults,
449+
# alternate spelling for backward compatiblity
448450
'_fields_defaults': field_defaults,
449451
'__new__': __new__,
450452
'_make': _make,

Lib/test/test_collections.py

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

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

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

261261
Point = namedtuple('Point', 'x y', defaults=()) # 0 defaults
262-
self.assertEqual(Point._fields_defaults, {})
262+
self.assertEqual(Point._field_defaults, {})
263263
self.assertEqual(Point(1, 2), (1, 2))
264264
with self.assertRaises(TypeError):
265265
Point(1)
@@ -276,21 +276,21 @@ def test_defaults(self):
276276
Point = namedtuple('Point', 'x y', defaults=False)
277277

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

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

292292
Point = namedtuple('Point', 'x y', defaults=iter([10, 20])) # allow plain iterator
293-
self.assertEqual(Point._fields_defaults, {'x': 10, 'y': 20})
293+
self.assertEqual(Point._field_defaults, {'x': 10, 'y': 20})
294294
self.assertEqual(Point.__new__.__defaults__, (10, 20))
295295
self.assertEqual(Point(1, 2), (1, 2))
296296
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)