summaryrefslogtreecommitdiffstats
path: root/Lib/typing.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2017-01-18 16:03:54 (GMT)
committerGuido van Rossum <guido@python.org>2017-01-18 16:03:54 (GMT)
commite69f0e6111facf751b75f6c73bb6dee2207af366 (patch)
treec0b1ac2c45e7ebdaec6d8c6542df1695575d9771 /Lib/typing.py
parent0a2e46835dbadc626a996c2d937f5b45123ca6de (diff)
parent49f08a2c26be96edd327a39d6613c22bb919c310 (diff)
downloadcpython-e69f0e6111facf751b75f6c73bb6dee2207af366.zip
cpython-e69f0e6111facf751b75f6c73bb6dee2207af366.tar.gz
cpython-e69f0e6111facf751b75f6c73bb6dee2207af366.tar.bz2
Issue #28556: allow default values in class form of NamedTuple -- Jelle Zijlstra (3.6->3.7)
Diffstat (limited to 'Lib/typing.py')
-rw-r--r--Lib/typing.py17
1 files changed, 16 insertions, 1 deletions
diff --git a/Lib/typing.py b/Lib/typing.py
index b798830..0aeb089 100644
--- a/Lib/typing.py
+++ b/Lib/typing.py
@@ -1959,7 +1959,22 @@ class NamedTupleMeta(type):
raise TypeError("Class syntax for NamedTuple is only supported"
" in Python 3.6+")
types = ns.get('__annotations__', {})
- return _make_nmtuple(typename, types.items())
+ nm_tpl = _make_nmtuple(typename, types.items())
+ defaults = []
+ defaults_dict = {}
+ for field_name in types:
+ if field_name in ns:
+ default_value = ns[field_name]
+ defaults.append(default_value)
+ defaults_dict[field_name] = default_value
+ elif defaults:
+ raise TypeError("Non-default namedtuple field {field_name} cannot follow default"
+ " field(s) {default_names}"
+ .format(field_name=field_name,
+ default_names=', '.join(defaults_dict.keys())))
+ nm_tpl.__new__.__defaults__ = tuple(defaults)
+ nm_tpl._field_defaults = defaults_dict
+ return nm_tpl
class NamedTuple(metaclass=NamedTupleMeta):
"""Typed version of namedtuple.