changeset: 102703:f086d6c9d9f6 user: Raymond Hettinger date: Tue Aug 16 10:55:43 2016 -0700 files: Doc/library/collections.rst Lib/collections/__init__.py Lib/test/test_collections.py Misc/NEWS description: Issue #25628: Make namedtuple "rename" and "verbose" parameters keyword-only. diff -r ad141164c792 -r f086d6c9d9f6 Doc/library/collections.rst --- a/Doc/library/collections.rst Tue Aug 16 18:27:44 2016 +0200 +++ b/Doc/library/collections.rst Tue Aug 16 10:55:43 2016 -0700 @@ -763,7 +763,7 @@ self-documenting code. They can be used wherever regular tuples are used, and they add the ability to access fields by name instead of position index. -.. function:: namedtuple(typename, field_names, verbose=False, rename=False) +.. function:: namedtuple(typename, field_names, *, verbose=False, rename=False) Returns a new tuple subclass named *typename*. The new subclass is used to create tuple-like objects that have fields accessible by attribute lookup as @@ -799,7 +799,11 @@ a namedtuple. .. versionchanged:: 3.1 - Added support for *rename*. + Added support for *rename*. + + .. versionchanged:: 3.6 + The *verbose* and *rename* parameters became + :ref:`keyword-only arguments `. .. doctest:: diff -r ad141164c792 -r f086d6c9d9f6 Lib/collections/__init__.py --- a/Lib/collections/__init__.py Tue Aug 16 18:27:44 2016 +0200 +++ b/Lib/collections/__init__.py Tue Aug 16 10:55:43 2016 -0700 @@ -353,7 +353,7 @@ {name} = _property(_itemgetter({index:d}), doc='Alias for field number {index:d}') ''' -def namedtuple(typename, field_names, verbose=False, rename=False): +def namedtuple(typename, field_names, *, verbose=False, rename=False): """Returns a new subclass of tuple with named fields. >>> Point = namedtuple('Point', ['x', 'y']) diff -r ad141164c792 -r f086d6c9d9f6 Lib/test/test_collections.py --- a/Lib/test/test_collections.py Tue Aug 16 18:27:44 2016 +0200 +++ b/Lib/test/test_collections.py Tue Aug 16 10:55:43 2016 -0700 @@ -412,6 +412,18 @@ self.assertEqual(NTColor._fields, ('red', 'green', 'blue')) globals().pop('NTColor', None) # clean-up after this test + def test_keyword_only_arguments(self): + # See issue 25628 + with support.captured_stdout() as template: + NT = namedtuple('NT', ['x', 'y'], verbose=True) + self.assertIn('class NT', NT._source) + with self.assertRaises(TypeError): + NT = namedtuple('NT', ['x', 'y'], True) + + NT = namedtuple('NT', ['abc', 'def'], rename=True) + self.assertEqual(NT._fields, ('abc', '_1')) + with self.assertRaises(TypeError): + NT = namedtuple('NT', ['abc', 'def'], False, True) def test_namedtuple_subclass_issue_24931(self): class Point(namedtuple('_Point', ['x', 'y'])): diff -r ad141164c792 -r f086d6c9d9f6 Misc/NEWS --- a/Misc/NEWS Tue Aug 16 18:27:44 2016 +0200 +++ b/Misc/NEWS Tue Aug 16 10:55:43 2016 -0700 @@ -73,6 +73,9 @@ to ref count problem introduced in code for Issue #27038 in 3.6.0a3. Patch by Xiang Zhang. +- Issue #25628: The *verbose* and *rename* parameters for collections.namedtuple + are now keyword-only. + - Issue #12345: Add mathemathical constant tau to math and cmath. See also PEP 628.