https://github.com/python/cpython/commit/7bb1e1a23634bae81bf76fdb34e9f9f7e59b3793
commit: 7bb1e1a23634bae81bf76fdb34e9f9f7e59b3793
branch: main
author: Xuehai Pan <xuehai...@pku.edu.cn>
committer: JelleZijlstra <jelle.zijls...@gmail.com>
date: 2025-04-06T16:37:37Z
summary:

gh-132159: Do not shadow user arguments in generated `__new__` by 
`@warnings.deprecated` (#132160)

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 6f4c569d247601..de4280cd22f0c9 100644
--- a/Lib/test/test_warnings/__init__.py
+++ b/Lib/test/test_warnings/__init__.py
@@ -1653,6 +1653,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 df844253ab4e6d..0307f89dafef5a 100644
--- a/Lib/warnings.py
+++ b/Lib/warnings.py
@@ -597,7 +597,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

Reply via email to