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
18 changes: 14 additions & 4 deletions Doc/library/typing.rst
Original file line number Diff line number Diff line change
Expand Up @@ -838,10 +838,11 @@ The module defines the following classes, functions and decorators:

Fields with a default value must come after any fields without a default.

The resulting class has two extra attributes: ``_field_types``,
giving a dict mapping field names to types, and ``_field_defaults``, a dict
mapping field names to default values. (The field names are in the
``_fields`` attribute, which is part of the namedtuple API.)
The resulting class has an extra attribute ``__annotations__`` giving a
dict that maps the field names to the field types. (The field names are in
the ``_fields`` attribute and the default values are in the
``_field_defaults`` attribute both of which are part of the namedtuple
API.)

``NamedTuple`` subclasses can also have docstrings and methods::

Expand All @@ -863,6 +864,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``.


.. function:: NewType(typ)

A helper function to indicate a distinct types to a typechecker,
Expand Down
4 changes: 4 additions & 0 deletions Doc/whatsnew/3.8.rst
Original file line number Diff line number Diff line change
Expand Up @@ -510,6 +510,10 @@ Deprecated

(Contributed by Berker Peksag in :issue:`9372`.)

* The :class:`typing.NamedTuple` class has deprecated the ``_field_types``
attribute in favor of the ``__annotations__`` attribute which has the same
information. (Contributed by Raymond Hettinger in :issue:`36320`.)

* :mod:`ast` classes ``Num``, ``Str``, ``Bytes``, ``NameConstant`` and
``Ellipsis`` are considered deprecated and will be removed in future Python
versions. :class:`~ast.Constant` should be used instead.
Expand Down
16 changes: 7 additions & 9 deletions Lib/typing.py
Original file line number Diff line number Diff line change
Expand Up @@ -1325,8 +1325,8 @@ def _make_nmtuple(name, types):
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, both __annotations__ and _field_types are used to maintain compatibility.
nm_tpl.__annotations__ = nm_tpl._field_types = collections.OrderedDict(types)
# Now __annotations__ are used and _field_types is deprecated (remove in 3.9)
nm_tpl.__annotations__ = nm_tpl._field_types = dict(types)
try:
nm_tpl.__module__ = sys._getframe(2).f_globals.get('__name__', '__main__')
except (AttributeError, ValueError):
Expand Down Expand Up @@ -1361,7 +1361,7 @@ def __new__(cls, typename, bases, ns):
"follow default field(s) {default_names}"
.format(field_name=field_name,
default_names=', '.join(defaults_dict.keys())))
nm_tpl.__new__.__annotations__ = collections.OrderedDict(types)
nm_tpl.__new__.__annotations__ = dict(types)
nm_tpl.__new__.__defaults__ = tuple(defaults)
nm_tpl._field_defaults = defaults_dict
# update from user namespace without overriding special namedtuple attributes
Expand All @@ -1386,12 +1386,10 @@ class Employee(NamedTuple):

Employee = collections.namedtuple('Employee', ['name', 'id'])

The resulting class has extra __annotations__ and _field_types
attributes, giving an ordered dict mapping field names to types.
__annotations__ should be preferred, while _field_types
is kept to maintain pre PEP 526 compatibility. (The field names
are in the _fields attribute, which is part of the namedtuple
API.) Alternative equivalent keyword syntax is also accepted::
The resulting class has an extra __annotations__ attribute, giving a
dict that maps field names to types. (The field names are also in
the _fields attribute, which is part of the namedtuple API.)
Alternative equivalent keyword syntax is also accepted::

Employee = NamedTuple('Employee', name=str, id=int)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
The typing.NamedTuple() class has deprecated the _field_types attribute in
favor of the __annotations__ attribute which carried the same information.
Also, both attributes were converted from OrderedDict to a regular dict.