mirror of
https://github.com/python/cpython.git
synced 2025-09-23 08:53:45 +00:00
bpo-32279: Add additional params to make_dataclass(), pass through to dataclass(). (gh-5117)
This commit is contained in:
parent
ed7d429ebb
commit
d80b443f02
3 changed files with 26 additions and 3 deletions
|
@ -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.
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Add params to dataclasses.make_dataclasses(): init, repr, eq, order, hash,
|
||||||
|
and frozen. Pass them through to dataclass().
|
Loading…
Add table
Add a link
Reference in a new issue