Browse Source

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

pull/5118/head
Eric V. Smith 8 years ago
committed by GitHub
parent
commit
d80b443f02
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 10
      Lib/dataclasses.py
  2. 17
      Lib/test/test_dataclasses.py
  3. 2
      Misc/NEWS.d/next/Library/2018-01-06-16-50-11.bpo-32279.1xOpU8.rst

10
Lib/dataclasses.py

@ -705,7 +705,8 @@ def _astuple_inner(obj, tuple_factory):
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.
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)
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:
@ -745,8 +749,8 @@ def make_dataclass(cls_name, fields, *, bases=(), namespace=None):
namespace['__annotations__'] = anns
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):
"""Return a new object replacing specified fields with new values.

17
Lib/test/test_dataclasses.py

@ -2033,6 +2033,23 @@ class TestCase(unittest.TestCase):
self.assertEqual(C.y, 10)
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):
C = make_dataclass('Point', ['x', 'y', 'z'])
c = C(1, 2, 3)

2
Misc/NEWS.d/next/Library/2018-01-06-16-50-11.bpo-32279.1xOpU8.rst

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