mirror of
https://github.com/python/cpython.git
synced 2025-10-09 16:34:44 +00:00
bpo-32278: Allow dataclasses.make_dataclass() to omit type information. (gh-5115)
This commit is contained in:
parent
e7ba013d87
commit
ed7d429ebb
3 changed files with 30 additions and 6 deletions
|
@ -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)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue