Commit d80b443f authored by Eric V. Smith's avatar Eric V. Smith Committed by GitHub

bpo-32279: Add additional params to make_dataclass(), pass through to dataclass(). (gh-5117)

parent ed7d429e
...@@ -705,7 +705,8 @@ def _astuple_inner(obj, tuple_factory): ...@@ -705,7 +705,8 @@ def _astuple_inner(obj, tuple_factory):
return deepcopy(obj) return deepcopy(obj)
def make_dataclass(cls_name, fields, *, bases=(), namespace=None): def make_dataclass(cls_name, fields, *, bases=(), namespace=None, init=True,
repr=True, eq=True, order=False, hash=None, frozen=False):
"""Return a new dynamically created dataclass. """Return a new dynamically created dataclass.
The dataclass name will be 'cls_name'. 'fields' is an iterable The dataclass name will be 'cls_name'. 'fields' is an iterable
...@@ -723,6 +724,9 @@ def make_dataclass(cls_name, fields, *, bases=(), namespace=None): ...@@ -723,6 +724,9 @@ def make_dataclass(cls_name, fields, *, bases=(), namespace=None):
b: int = field(init=False) b: int = field(init=False)
For the bases and namespace paremeters, see the builtin type() function. For the bases and namespace paremeters, see the builtin type() function.
The parameters init, repr, eq, order, hash, and frozen are passed to
dataclass().
""" """
if namespace is None: if namespace is None:
...@@ -745,8 +749,8 @@ def make_dataclass(cls_name, fields, *, bases=(), namespace=None): ...@@ -745,8 +749,8 @@ def make_dataclass(cls_name, fields, *, bases=(), namespace=None):
namespace['__annotations__'] = anns namespace['__annotations__'] = anns
cls = type(cls_name, bases, namespace) cls = type(cls_name, bases, namespace)
return dataclass(cls) return dataclass(cls, init=init, repr=repr, eq=eq, order=order,
hash=hash, frozen=frozen)
def replace(obj, **changes): def replace(obj, **changes):
"""Return a new object replacing specified fields with new values. """Return a new object replacing specified fields with new values.
......
...@@ -2033,6 +2033,23 @@ class TestCase(unittest.TestCase): ...@@ -2033,6 +2033,23 @@ class TestCase(unittest.TestCase):
self.assertEqual(C.y, 10) self.assertEqual(C.y, 10)
self.assertEqual(C.z, 20) self.assertEqual(C.z, 20)
def test_helper_make_dataclass_other_params(self):
C = make_dataclass('C',
[('x', int),
('y', ClassVar[int], 10),
('z', ClassVar[int], field(default=20)),
],
init=False)
# Make sure we have a repr, but no init.
self.assertNotIn('__init__', vars(C))
self.assertIn('__repr__', vars(C))
# Make sure random other params don't work.
with self.assertRaisesRegex(TypeError, 'unexpected keyword argument'):
C = make_dataclass('C',
[],
xxinit=False)
def test_helper_make_dataclass_no_types(self): def test_helper_make_dataclass_no_types(self):
C = make_dataclass('Point', ['x', 'y', 'z']) C = make_dataclass('Point', ['x', 'y', 'z'])
c = C(1, 2, 3) c = C(1, 2, 3)
......
Add params to dataclasses.make_dataclasses(): init, repr, eq, order, hash,
and frozen. Pass them through to dataclass().
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment