[Python-checkins] bpo-40182: Remove the _field_types attribute of the NamedTuple class (GH-19368)

Serhiy Storchaka webhook-mailer at python.org
Sat Apr 4 17:43:25 EDT 2020


https://github.com/python/cpython/commit/6fed3c85402c5ca704eb3f3189ca3f5c67a08d19
commit: 6fed3c85402c5ca704eb3f3189ca3f5c67a08d19
branch: master
author: Serhiy Storchaka <storchaka at gmail.com>
committer: GitHub <noreply at github.com>
date: 2020-04-05T00:43:20+03:00
summary:

bpo-40182: Remove the _field_types attribute of the NamedTuple class (GH-19368)

files:
A Misc/NEWS.d/next/Library/2020-04-04-23-44-09.bpo-40182.Bf_kFN.rst
M Doc/library/typing.rst
M Doc/whatsnew/3.9.rst
M Lib/test/test_typing.py
M Lib/typing.py

diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst
index 58ae184578616..fa13c07c44ea3 100644
--- a/Doc/library/typing.rst
+++ b/Doc/library/typing.rst
@@ -959,14 +959,15 @@ The module defines the following classes, functions and decorators:
    .. versionchanged:: 3.6.1
       Added support for default values, methods, and docstrings.
 
-   .. versionchanged:: 3.8
-      Deprecated the ``_field_types`` attribute in favor of the more
-      standard ``__annotations__`` attribute which has the same information.
-
    .. versionchanged:: 3.8
       The ``_field_types`` and ``__annotations__`` attributes are
       now regular dictionaries instead of instances of ``OrderedDict``.
 
+   .. versionchanged:: 3.9
+      Removed the ``_field_types`` attribute in favor of the more
+      standard ``__annotations__`` attribute which has the same information.
+
+
 .. class:: TypedDict(dict)
 
    A simple typed namespace. At runtime it is equivalent to
diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst
index fc48cd67edcf6..ef499f504682d 100644
--- a/Doc/whatsnew/3.9.rst
+++ b/Doc/whatsnew/3.9.rst
@@ -734,6 +734,11 @@ Removed
   defining ``COUNT_ALLOCS`` macro.
   (Contributed by Victor Stinner in :issue:`39489`.)
 
+* The ``_field_types`` attribute of the :class:`typing.NamedTuple` class
+  has been removed.  It was deprecated deprecated since Python 3.8.  Use
+  the ``__annotations__`` attribute instead.
+  (Contributed by Serhiy Storchaka in :issue:`40182`.)
+
 
 Porting to Python 3.9
 =====================
diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py
index 3a0edb9e2d323..dea09eb874d19 100644
--- a/Lib/test/test_typing.py
+++ b/Lib/test/test_typing.py
@@ -3561,7 +3561,6 @@ def test_basics(self):
         self.assertEqual(Emp._fields, ('name', 'id'))
         self.assertEqual(Emp.__annotations__,
                          collections.OrderedDict([('name', str), ('id', int)]))
-        self.assertIs(Emp._field_types, Emp.__annotations__)
 
     def test_namedtuple_pyversion(self):
         if sys.version_info[:2] < (3, 6):
@@ -3581,7 +3580,6 @@ def test_annotation_usage(self):
         self.assertEqual(CoolEmployee._fields, ('name', 'cool'))
         self.assertEqual(CoolEmployee.__annotations__,
                          collections.OrderedDict(name=str, cool=int))
-        self.assertIs(CoolEmployee._field_types, CoolEmployee.__annotations__)
 
     def test_annotation_usage_with_default(self):
         jelle = CoolEmployeeWithDefault('Jelle')
@@ -3594,7 +3592,8 @@ def test_annotation_usage_with_default(self):
 
         self.assertEqual(CoolEmployeeWithDefault.__name__, 'CoolEmployeeWithDefault')
         self.assertEqual(CoolEmployeeWithDefault._fields, ('name', 'cool'))
-        self.assertEqual(CoolEmployeeWithDefault._field_types, dict(name=str, cool=int))
+        self.assertEqual(CoolEmployeeWithDefault.__annotations__,
+                         dict(name=str, cool=int))
         self.assertEqual(CoolEmployeeWithDefault._field_defaults, dict(cool=0))
 
         with self.assertRaises(TypeError):
@@ -3641,7 +3640,6 @@ def test_namedtuple_keyword_usage(self):
         self.assertEqual(LocalEmployee.__name__, 'LocalEmployee')
         self.assertEqual(LocalEmployee._fields, ('name', 'age'))
         self.assertEqual(LocalEmployee.__annotations__, dict(name=str, age=int))
-        self.assertIs(LocalEmployee._field_types, LocalEmployee.__annotations__)
         with self.assertRaises(TypeError):
             NamedTuple('Name', [('x', int)], y=str)
         with self.assertRaises(TypeError):
diff --git a/Lib/typing.py b/Lib/typing.py
index 99355d0066647..a72003a4a96fa 100644
--- a/Lib/typing.py
+++ b/Lib/typing.py
@@ -1705,9 +1705,7 @@ def _make_nmtuple(name, types):
     msg = "NamedTuple('Name', [(f0, t0), (f1, t1), ...]); each t must be a type"
     types = [(n, _type_check(t, msg)) for n, t in types]
     nm_tpl = collections.namedtuple(name, [n for n, t in types])
-    # Prior to PEP 526, only _field_types attribute was assigned.
-    # Now __annotations__ are used and _field_types is deprecated (remove in 3.9)
-    nm_tpl.__annotations__ = nm_tpl._field_types = dict(types)
+    nm_tpl.__annotations__ = dict(types)
     try:
         nm_tpl.__module__ = sys._getframe(2).f_globals.get('__name__', '__main__')
     except (AttributeError, ValueError):
@@ -1717,7 +1715,7 @@ def _make_nmtuple(name, types):
 
 # attributes prohibited to set in NamedTuple class syntax
 _prohibited = {'__new__', '__init__', '__slots__', '__getnewargs__',
-               '_fields', '_field_defaults', '_field_types',
+               '_fields', '_field_defaults',
                '_make', '_replace', '_asdict', '_source'}
 
 _special = {'__module__', '__name__', '__annotations__'}
diff --git a/Misc/NEWS.d/next/Library/2020-04-04-23-44-09.bpo-40182.Bf_kFN.rst b/Misc/NEWS.d/next/Library/2020-04-04-23-44-09.bpo-40182.Bf_kFN.rst
new file mode 100644
index 0000000000000..1120584ecc575
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-04-04-23-44-09.bpo-40182.Bf_kFN.rst
@@ -0,0 +1,2 @@
+Removed the ``_field_types`` attribute of the :class:`typing.NamedTuple`
+class.



More information about the Python-checkins mailing list