Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions Doc/library/typing.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 5 additions & 0 deletions Doc/whatsnew/3.9.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
=====================
Expand Down
6 changes: 2 additions & 4 deletions Lib/test/test_typing.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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')
Expand All @@ -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):
Expand Down Expand Up @@ -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):
Expand Down
6 changes: 2 additions & 4 deletions Lib/typing.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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__'}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Removed the ``_field_types`` attribute of the :class:`typing.NamedTuple`
class.