https://github.com/python/cpython/commit/83070aa1089e8e8eaa72092da68d2ecd96d23536 commit: 83070aa1089e8e8eaa72092da68d2ecd96d23536 branch: 3.13 author: Miss Islington (bot) <31488909+miss-isling...@users.noreply.github.com> committer: JelleZijlstra <jelle.zijls...@gmail.com> date: 2025-04-06T17:00:54Z summary:
[3.13] gh-132159: Do not shadow user arguments in generated `__new__` by `@warnings.deprecated` (GH-132160) (#132163) gh-132159: Do not shadow user arguments in generated `__new__` by `@warnings.deprecated` (GH-132160) (cherry picked from commit 7bb1e1a23634bae81bf76fdb34e9f9f7e59b3793) Co-authored-by: Xuehai Pan <xuehai...@pku.edu.cn> files: A Misc/NEWS.d/next/Library/2025-04-06-16-12-49.gh-issue-132159.WvBfBm.rst M Lib/test/test_warnings/__init__.py M Lib/warnings.py diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py index 5ed71495d84af0..e2dd909647078b 100644 --- a/Lib/test/test_warnings/__init__.py +++ b/Lib/test/test_warnings/__init__.py @@ -1628,6 +1628,25 @@ class Child(Base, Mixin): instance = Child(42) self.assertEqual(instance.a, 42) + def test_do_not_shadow_user_arguments(self): + new_called = False + new_called_cls = None + + @deprecated("MyMeta will go away soon") + class MyMeta(type): + def __new__(mcs, name, bases, attrs, cls=None): + nonlocal new_called, new_called_cls + new_called = True + new_called_cls = cls + return super().__new__(mcs, name, bases, attrs) + + with self.assertWarnsRegex(DeprecationWarning, "MyMeta will go away soon"): + class Foo(metaclass=MyMeta, cls='haha'): + pass + + self.assertTrue(new_called) + self.assertEqual(new_called_cls, 'haha') + def test_existing_init_subclass(self): @deprecated("C will go away soon") class C: diff --git a/Lib/warnings.py b/Lib/warnings.py index 8d340b5b578992..f83aaf231eaa55 100644 --- a/Lib/warnings.py +++ b/Lib/warnings.py @@ -589,7 +589,7 @@ def __call__(self, arg, /): original_new = arg.__new__ @functools.wraps(original_new) - def __new__(cls, *args, **kwargs): + def __new__(cls, /, *args, **kwargs): if cls is arg: warn(msg, category=category, stacklevel=stacklevel + 1) if original_new is not object.__new__: diff --git a/Misc/NEWS.d/next/Library/2025-04-06-16-12-49.gh-issue-132159.WvBfBm.rst b/Misc/NEWS.d/next/Library/2025-04-06-16-12-49.gh-issue-132159.WvBfBm.rst new file mode 100644 index 00000000000000..8cec76e9b47405 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-04-06-16-12-49.gh-issue-132159.WvBfBm.rst @@ -0,0 +1 @@ +Do not shadow user arguments in generated :meth:`!__new__` by decorator :class:`warnings.deprecated`. Patch by Xuehai Pan. _______________________________________________ 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