Skip to content

Commit 398d7e1

Browse files
authored
gh-79413: Add qualname parameter to dataclass.make_dataclass. (GH-150026)
Added `qualname` parameter to `dataclasses.make_dataclass` in order to allow user to set `__qualname__` for the generated class.
1 parent 57a0e57 commit 398d7e1

4 files changed

Lines changed: 25 additions & 2 deletions

File tree

Doc/library/dataclasses.rst

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ Module contents
418418
:func:`!astuple` raises :exc:`TypeError` if *obj* is not a dataclass
419419
instance.
420420

421-
.. function:: make_dataclass(cls_name, fields, *, bases=(), namespace=None, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False, weakref_slot=False, module=None, decorator=dataclass)
421+
.. function:: make_dataclass(cls_name, fields, *, bases=(), namespace=None, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False, weakref_slot=False, module=None, qualname=None, decorator=dataclass)
422422

423423
Creates a new dataclass with name *cls_name*, fields as defined
424424
in *fields*, base classes as given in *bases*, and initialized
@@ -434,6 +434,9 @@ Module contents
434434
of the dataclass is set to that value.
435435
By default, it is set to the module name of the caller.
436436

437+
If *qualname* is defined, the :attr:`~type.__qualname__` attribute of the dataclass
438+
is set to that value. By default, it is set to the value passed to *cls_name*.
439+
437440
The *decorator* parameter is a callable that will be used to create the dataclass.
438441
It should take the class object as a first argument and the same keyword arguments
439442
as :deco:`dataclass`. By default, the :deco:`dataclass`
@@ -464,6 +467,8 @@ Module contents
464467

465468
.. versionadded:: 3.14
466469
Added the *decorator* parameter.
470+
.. versionadded:: next
471+
Added the *qualname* parameter.
467472

468473
.. function:: replace(obj, /, **changes)
469474

Lib/dataclasses.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1644,7 +1644,7 @@ def _astuple_inner(obj, tuple_factory):
16441644
def make_dataclass(cls_name, fields, *, bases=(), namespace=None, init=True,
16451645
repr=True, eq=True, order=False, unsafe_hash=False,
16461646
frozen=False, match_args=True, kw_only=False, slots=False,
1647-
weakref_slot=False, module=None, decorator=dataclass):
1647+
weakref_slot=False, module=None, qualname=None, decorator=dataclass):
16481648
"""Return a new dynamically created dataclass.
16491649
16501650
The dataclass name will be 'cls_name'. 'fields' is an iterable
@@ -1669,6 +1669,9 @@ class C(Base):
16691669
16701670
If module parameter is defined, the '__module__' attribute of the dataclass is
16711671
set to that value.
1672+
1673+
If qualname parameter is defined, the '__qualname__' attribute of the dataclass is set
1674+
to that value.
16721675
"""
16731676

16741677
if namespace is None:
@@ -1758,6 +1761,9 @@ def exec_body_callback(ns):
17581761
if module is not None:
17591762
cls.__module__ = module
17601763

1764+
if qualname:
1765+
cls.__qualname__ = qualname
1766+
17611767
# Apply the normal provided decorator.
17621768
cls = decorator(cls, init=init, repr=repr, eq=eq, order=order,
17631769
unsafe_hash=unsafe_hash, frozen=frozen,

Lib/test/test_dataclasses/__init__.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5289,6 +5289,15 @@ class A:
52895289
self.assertEqual(len(fs), 1)
52905290
self.assertEqual(fs[0].name, 'x')
52915291

5292+
def test_makedataclass_with_qualname(self):
5293+
A = make_dataclass("A", ['a'], qualname='ClassA')
5294+
self.assertEqual(A.__qualname__, 'ClassA')
5295+
5296+
B = make_dataclass("B", ['b'], qualname='module1.ClassB')
5297+
self.assertEqual(B.__qualname__, 'module1.ClassB')
5298+
5299+
C = make_dataclass("C", ['c'])
5300+
self.assertEqual(C.__qualname__, 'C')
52925301

52935302
class TestZeroArgumentSuperWithSlots(unittest.TestCase):
52945303
def test_zero_argument_super(self):
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Update :func:`dataclasses.make_dataclass` to add a *qualname* parameter. The
2+
*qualname* parameter will be used to set the :attr:`!__qualname__` of the
3+
created ``dataclass``.

0 commit comments

Comments
 (0)