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

This commit is contained in:
Eric V. Smith 2018-01-06 17:09:58 -05:00 committed by GitHub
parent ed7d429ebb
commit d80b443f02
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 26 additions and 3 deletions

View file

@ -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):
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):
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.

View file

@ -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)

View file

@ -0,0 +1,2 @@
Add params to dataclasses.make_dataclasses(): init, repr, eq, order, hash,
and frozen. Pass them through to dataclass().