https://github.com/python/cpython/commit/293fa3433e40f5b0a7aa4d5b94f53c06b2187b25 commit: 293fa3433e40f5b0a7aa4d5b94f53c06b2187b25 branch: main author: Bartosz Sławecki <bart...@ilikepython.com> committer: JelleZijlstra <jelle.zijls...@gmail.com> date: 2025-03-05T20:45:47-08:00 summary:
gh-85795: Raise a clear error when `super()` is used in `typing.NamedTuple` subclasses (#130082) files: A Misc/NEWS.d/next/Library/2025-02-13-15-10-56.gh-issue-85795.jeXXI9.rst M Doc/library/typing.rst M Lib/test/test_typing.py M Lib/typing.py diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index d4ab6eaea12d23..aa613ee9f52f0a 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -2398,6 +2398,10 @@ types. .. versionchanged:: 3.11 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 The undocumented keyword argument syntax for creating NamedTuple classes (``NT = NamedTuple("NT", x=int)``) is deprecated, and will be disallowed diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index e88c811bfcac52..a7901dfa6a4ef0 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -8349,6 +8349,23 @@ class VeryAnnoying(metaclass=Meta): pass class Foo(NamedTuple): 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): def test_basics_functional_syntax(self): diff --git a/Lib/typing.py b/Lib/typing.py index 4b3c63b25aeeab..1dd115473fb927 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -2889,6 +2889,9 @@ def annotate(format): class NamedTupleMeta(type): def __new__(cls, typename, bases, ns): 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: if base is not _NamedTuple and base is not Generic: raise TypeError( diff --git a/Misc/NEWS.d/next/Library/2025-02-13-15-10-56.gh-issue-85795.jeXXI9.rst b/Misc/NEWS.d/next/Library/2025-02-13-15-10-56.gh-issue-85795.jeXXI9.rst new file mode 100644 index 00000000000000..dec162bb624a15 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-02-13-15-10-56.gh-issue-85795.jeXXI9.rst @@ -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`. _______________________________________________ Python-checkins mailing list -- python-checkins@python.org To unsubscribe send an email to python-checkins-le...@python.org https://mail.python.org/mailman3/lists/python-checkins.python.org/ Member address: arch...@mail-archive.com