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

Reply via email to