]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-102029: Deprecate passing arguments to `_PyRLock` in `threading` (#102071)
authorNikita Sobolev <mail@sobolevn.me>
Thu, 17 Aug 2023 16:19:07 +0000 (19:19 +0300)
committerGitHub <noreply@github.com>
Thu, 17 Aug 2023 16:19:07 +0000 (09:19 -0700)
Doc/whatsnew/3.13.rst
Lib/test/test_threading.py
Lib/threading.py
Misc/NEWS.d/next/Library/2023-02-20-15-41-59.gh-issue-102029.9ZPG99.rst [new file with mode: 0644]

index 519dee5eb7d6cf50d780cd8c3e4a3cd830c9832e..13ae6e595dc9937b1c4ccb51eb7c093c41f8e607 100644 (file)
@@ -357,6 +357,12 @@ Pending Removal in Python 3.15
   They will be removed in Python 3.15.
   (Contributed by Victor Stinner in :gh:`105096`.)
 
+* Passing any arguments to :func:`threading.RLock` is now deprecated.
+  C version allows any numbers of args and kwargs,
+  but they are just ignored. Python version does not allow any arguments.
+  All arguments will be removed from :func:`threading.RLock` in Python 3.15.
+  (Contributed by Nikita Sobolev in :gh:`102029`.)
+
 Pending Removal in Python 3.16
 ------------------------------
 
index 4a91eef31c4b8bf1109b49f514cd829c40180cc5..6465a446565844eb5ac6a7e57bc918b2f763be18 100644 (file)
@@ -1748,6 +1748,30 @@ class PyRLockTests(lock_tests.RLockTests):
 class CRLockTests(lock_tests.RLockTests):
     locktype = staticmethod(threading._CRLock)
 
+    def test_signature(self):  # gh-102029
+        with warnings.catch_warnings(record=True) as warnings_log:
+            threading.RLock()
+        self.assertEqual(warnings_log, [])
+
+        arg_types = [
+            ((1,), {}),
+            ((), {'a': 1}),
+            ((1, 2), {'a': 1}),
+        ]
+        for args, kwargs in arg_types:
+            with self.subTest(args=args, kwargs=kwargs):
+                with self.assertWarns(DeprecationWarning):
+                    threading.RLock(*args, **kwargs)
+
+        # Subtypes with custom `__init__` are allowed (but, not recommended):
+        class CustomRLock(self.locktype):
+            def __init__(self, a, *, b) -> None:
+                super().__init__()
+
+        with warnings.catch_warnings(record=True) as warnings_log:
+            CustomRLock(1, b=2)
+        self.assertEqual(warnings_log, [])
+
 class EventTests(lock_tests.EventTests):
     eventtype = staticmethod(threading.Event)
 
index e036cb891e196d8662bdbef82dd9c0f68ceb5a0c..f6bbdb0d0c80ee8cab0f50eaa12576ae7608ff7f 100644 (file)
@@ -4,6 +4,7 @@ import os as _os
 import sys as _sys
 import _thread
 import functools
+import warnings
 
 from time import monotonic as _time
 from _weakrefset import WeakSet
@@ -116,6 +117,12 @@ def RLock(*args, **kwargs):
     acquired it.
 
     """
+    if args or kwargs:
+        warnings.warn(
+            'Passing arguments to RLock is deprecated and will be removed in 3.15',
+            DeprecationWarning,
+            stacklevel=2,
+        )
     if _CRLock is None:
         return _PyRLock(*args, **kwargs)
     return _CRLock(*args, **kwargs)
diff --git a/Misc/NEWS.d/next/Library/2023-02-20-15-41-59.gh-issue-102029.9ZPG99.rst b/Misc/NEWS.d/next/Library/2023-02-20-15-41-59.gh-issue-102029.9ZPG99.rst
new file mode 100644 (file)
index 0000000..4d6f05f
--- /dev/null
@@ -0,0 +1 @@
+Deprecate passing any arguments to :func:`threading.RLock`.