gh-85795: Raise a clear error when super() is used in typing.NamedTuple subclasses (#130082)

This commit is contained in:
Bartosz Sławecki 2025-03-06 05:45:47 +01:00 committed by GitHub
parent 5e73ece95e
commit 293fa3433e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 27 additions and 0 deletions

View file

@ -2398,6 +2398,10 @@ types.
.. versionchanged:: 3.11 .. versionchanged:: 3.11
Added support for generic namedtuples. Added support for generic namedtuples.
.. versionchanged:: next
Using :func:`super` (and the ``__class__`` :term:`closure variable`) in methods of ``NamedTuple`` subclasses
is unsupported and causes a :class:`TypeError`.
.. deprecated-removed:: 3.13 3.15 .. deprecated-removed:: 3.13 3.15
The undocumented keyword argument syntax for creating NamedTuple classes The undocumented keyword argument syntax for creating NamedTuple classes
(``NT = NamedTuple("NT", x=int)``) is deprecated, and will be disallowed (``NT = NamedTuple("NT", x=int)``) is deprecated, and will be disallowed

View file

@ -8349,6 +8349,23 @@ class NamedTupleTests(BaseTestCase):
class Foo(NamedTuple): class Foo(NamedTuple):
attr = very_annoying attr = very_annoying
def test_super_explicitly_disallowed(self):
expected_message = (
"uses of super() and __class__ are unsupported "
"in methods of NamedTuple subclasses"
)
with self.assertRaises(TypeError, msg=expected_message):
class ThisWontWork(NamedTuple):
def __repr__(self):
return super().__repr__()
with self.assertRaises(TypeError, msg=expected_message):
class ThisWontWorkEither(NamedTuple):
@property
def name(self):
return __class__.__name__
class TypedDictTests(BaseTestCase): class TypedDictTests(BaseTestCase):
def test_basics_functional_syntax(self): def test_basics_functional_syntax(self):

View file

@ -2889,6 +2889,9 @@ _special = frozenset({'__module__', '__name__', '__annotations__', '__annotate__
class NamedTupleMeta(type): class NamedTupleMeta(type):
def __new__(cls, typename, bases, ns): def __new__(cls, typename, bases, ns):
assert _NamedTuple in bases assert _NamedTuple in bases
if "__classcell__" in ns:
raise TypeError(
"uses of super() and __class__ are unsupported in methods of NamedTuple subclasses")
for base in bases: for base in bases:
if base is not _NamedTuple and base is not Generic: if base is not _NamedTuple and base is not Generic:
raise TypeError( raise TypeError(

View file

@ -0,0 +1,3 @@
Using :func:`super` and ``__class__`` :term:`closure variable` in
user-defined methods of :class:`typing.NamedTuple` subclasses is now
explicitly prohibited at runtime. Contributed by Bartosz Sławecki in :gh:`130082`.