diff options
author | Guido van Rossum <guido@python.org> | 2017-01-18 08:03:52 -0800 |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2017-01-18 08:03:52 -0800 |
commit | 49f08a2c26be96edd327a39d6613c22bb919c310 (patch) | |
tree | 29b17f243e78c490f58bfb626a0fa55d0dd4eab0 /Lib/typing.py | |
parent | 4710935b119d24b2cc1ffce37d0f7f8c6a9fceab (diff) | |
parent | 3c268be885d62b1b5ac572340641024af2c02ce4 (diff) | |
download | cpython-git-49f08a2c26be96edd327a39d6613c22bb919c310.tar.gz |
Issue #28556: allow default values in class form of NamedTuple -- Jelle Zijlstra (3.5->3.6)
Diffstat (limited to 'Lib/typing.py')
-rw-r--r-- | Lib/typing.py | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/Lib/typing.py b/Lib/typing.py index b798830f65..0aeb089d5d 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. |