Skip to content

Commit 42fee93

Browse files
authored
bpo-43827: Make arguments to abc.ABCMeta.__new__ pos-only (#25385)
To avoid conflicts with `__init__subclass__`.
1 parent a95138b commit 42fee93

File tree

4 files changed

+16
-1
lines changed

4 files changed

+16
-1
lines changed

Lib/abc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ class ABCMeta(type):
102102
implementations defined by the registering ABC be callable (not
103103
even via super()).
104104
"""
105-
def __new__(mcls, name, bases, namespace, **kwargs):
105+
def __new__(mcls, name, bases, namespace, /, **kwargs):
106106
cls = super().__new__(mcls, name, bases, namespace, **kwargs)
107107
_abc_init(cls)
108108
return cls

Lib/test/test_abc.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,19 @@ def __init_subclass__(cls, **kwargs):
668668
class Receiver(ReceivesClassKwargs, abc_ABC, x=1, y=2, z=3):
669669
pass
670670
self.assertEqual(saved_kwargs, dict(x=1, y=2, z=3))
671+
672+
def test_positional_only_and_kwonlyargs_with_init_subclass(self):
673+
saved_kwargs = {}
674+
675+
class A:
676+
def __init_subclass__(cls, **kwargs):
677+
super().__init_subclass__()
678+
saved_kwargs.update(kwargs)
679+
680+
class B(A, metaclass=abc_ABCMeta, name="test"):
681+
pass
682+
self.assertEqual(saved_kwargs, dict(name="test"))
683+
671684
return TestLegacyAPI, TestABC, TestABCWithInitSubclass
672685

673686
TestLegacyAPI_Py, TestABC_Py, TestABCWithInitSubclass_Py = test_factory(abc.ABCMeta,

Misc/ACKS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,7 @@ Albert Hofkamp
753753
Chris Hogan
754754
Tomas Hoger
755755
Jonathan Hogg
756+
Vladyslav Hoi
756757
Kamilla Holanda
757758
Steve Holden
758759
Akintayo Holder
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
All positional-or-keyword parameters to ``ABCMeta.__new__`` are now positional-only to avoid conflicts with keyword arguments to be passed to :meth:`__init_subclass__`.

0 commit comments

Comments
 (0)