https://github.com/python/cpython/commit/cfdf376e2a35878d48a1ad811e1664e92d6d30f1
commit: cfdf376e2a35878d48a1ad811e1664e92d6d30f1
branch: 3.13
author: Miss Islington (bot) <[email protected]>
committer: sobolevn <[email protected]>
date: 2024-09-01T18:19:56+03:00
summary:

[3.13] gh-91126: Docs and tests for slotted dataclasses with 
`__init_subclass__` (GH-123342) (#123568)

gh-91126: Docs and tests for slotted dataclasses with `__init_subclass__` 
(GH-123342)
(cherry picked from commit 75e72822a390df81ca11355d8e0aac88e4046c27)

Co-authored-by: sobolevn <[email protected]>

files:
M Doc/library/dataclasses.rst
M Lib/test/test_dataclasses/__init__.py

diff --git a/Doc/library/dataclasses.rst b/Doc/library/dataclasses.rst
index fcb5e8bad295a0..db1e6af530bdeb 100644
--- a/Doc/library/dataclasses.rst
+++ b/Doc/library/dataclasses.rst
@@ -185,10 +185,21 @@ Module contents
    - *slots*: If true (the default is ``False``), :attr:`~object.__slots__` 
attribute
      will be generated and new class will be returned instead of the original 
one.
      If :attr:`!__slots__` is already defined in the class, then 
:exc:`TypeError`
-     is raised. Calling no-arg :func:`super` in dataclasses using 
``slots=True`` will result in
-     the following exception being raised:
-     ``TypeError: super(type, obj): obj must be an instance or subtype of 
type``.
-     The two-arg :func:`super` is a valid workaround. See :gh:`90562` for full 
details.
+     is raised.
+
+    .. warning::
+        Calling no-arg :func:`super` in dataclasses using ``slots=True``
+        will result in the following exception being raised:
+        ``TypeError: super(type, obj): obj must be an instance or subtype of 
type``.
+        The two-arg :func:`super` is a valid workaround.
+        See :gh:`90562` for full details.
+
+    .. warning::
+       Passing parameters to a base class :meth:`~object.__init_subclass__`
+       when using ``slots=True`` will result in a :exc:`TypeError`.
+       Either use ``__init_subclass__`` with no parameters
+       or use default values as a workaround.
+       See :gh:`91126` for full details.
 
     .. versionadded:: 3.10
 
diff --git a/Lib/test/test_dataclasses/__init__.py 
b/Lib/test/test_dataclasses/__init__.py
index ffb8bbe75c504f..260e0d74917181 100644
--- a/Lib/test/test_dataclasses/__init__.py
+++ b/Lib/test/test_dataclasses/__init__.py
@@ -3664,6 +3664,38 @@ class A(WithDictSlot): ...
         self.assertEqual(A().__dict__, {})
         A()
 
+    @support.cpython_only
+    def test_slots_with_wrong_init_subclass(self):
+        # TODO: This test is for a kinda-buggy behavior.
+        # Ideally, it should be fixed and `__init_subclass__`
+        # should be fully supported in the future versions.
+        # See https://github.com/python/cpython/issues/91126
+        class WrongSuper:
+            def __init_subclass__(cls, arg):
+                pass
+
+        with self.assertRaisesRegex(
+            TypeError,
+            "missing 1 required positional argument: 'arg'",
+        ):
+            @dataclass(slots=True)
+            class WithWrongSuper(WrongSuper, arg=1):
+                pass
+
+        class CorrectSuper:
+            args = []
+            def __init_subclass__(cls, arg="default"):
+                cls.args.append(arg)
+
+        @dataclass(slots=True)
+        class WithCorrectSuper(CorrectSuper):
+            pass
+
+        # __init_subclass__ is called twice: once for `WithCorrectSuper`
+        # and once for `WithCorrectSuper__slots__` new class
+        # that we create internally.
+        self.assertEqual(CorrectSuper.args, ["default", "default"])
+
 
 class TestDescriptors(unittest.TestCase):
     def test_set_name(self):

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]

Reply via email to