diff options
Diffstat (limited to 'Lib/dataclasses.py')
-rw-r--r-- | Lib/dataclasses.py | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index b4786bf502..c4e94b8f66 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -708,9 +708,10 @@ def _astuple_inner(obj, tuple_factory): def make_dataclass(cls_name, fields, *, bases=(), namespace=None): """Return a new dynamically created dataclass. - The dataclass name will be 'cls_name'. 'fields' is an interable - of either (name, type) or (name, type, Field) objects. Field - objects are created by calling 'field(name, type [, Field])'. + The dataclass name will be 'cls_name'. 'fields' is an iterable + of either (name), (name, type) or (name, type, Field) objects. If type is + omitted, use the string 'typing.Any'. Field objects are created by + calling 'field(name, type [, Field])'. C = make_class('C', [('a', int', ('b', int, Field(init=False))], bases=Base) @@ -730,12 +731,19 @@ def make_dataclass(cls_name, fields, *, bases=(), namespace=None): # Copy namespace since we're going to mutate it. namespace = namespace.copy() - anns = collections.OrderedDict((name, tp) for name, tp, *_ in fields) - namespace['__annotations__'] = anns + anns = collections.OrderedDict() for item in fields: - if len(item) == 3: + if isinstance(item, str): + name = item + tp = 'typing.Any' + elif len(item) == 2: + name, tp, = item + elif len(item) == 3: name, tp, spec = item namespace[name] = spec + anns[name] = tp + + namespace['__annotations__'] = anns cls = type(cls_name, bases, namespace) return dataclass(cls) |