]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-118402: Fix inspect.signature() for functools.cmp_to_key() result (GH-118427)
authorSerhiy Storchaka <storchaka@gmail.com>
Tue, 30 Apr 2024 14:49:28 +0000 (17:49 +0300)
committerGitHub <noreply@github.com>
Tue, 30 Apr 2024 14:49:28 +0000 (17:49 +0300)
Lib/test/test_functools.py
Misc/NEWS.d/next/Library/2024-04-29-21-51-28.gh-issue-118402.Z_06Th.rst [new file with mode: 0644]
Modules/_functoolsmodule.c

index bb4c7cc8701fb42e0fc8f0cd8cb6cc817a009e38..4a9a7313712f602b9207dedcf12259081d3e29be 100644 (file)
@@ -947,8 +947,13 @@ class TestCmpToKey:
     @unittest.skipIf(support.MISSING_C_DOCSTRINGS,
                      "Signature information for builtins requires docstrings")
     def test_cmp_to_signature(self):
-        self.assertEqual(str(Signature.from_callable(self.cmp_to_key)),
-                         '(mycmp)')
+        sig = Signature.from_callable(self.cmp_to_key)
+        self.assertEqual(str(sig), '(mycmp)')
+        def mycmp(x, y):
+            return y - x
+        sig = Signature.from_callable(self.cmp_to_key(mycmp))
+        self.assertEqual(str(sig), '(obj)')
+
 
 
 @unittest.skipUnless(c_functools, 'requires the C _functools module')
@@ -1864,9 +1869,10 @@ class TestLRU:
             self.assertIsNone(ref())
 
     def test_common_signatures(self):
-        def orig(): ...
+        def orig(a, /, b, c=True): ...
         lru = self.module.lru_cache(1)(orig)
 
+        self.assertEqual(str(Signature.from_callable(lru)), '(a, /, b, c=True)')
         self.assertEqual(str(Signature.from_callable(lru.cache_info)), '()')
         self.assertEqual(str(Signature.from_callable(lru.cache_clear)), '()')
 
diff --git a/Misc/NEWS.d/next/Library/2024-04-29-21-51-28.gh-issue-118402.Z_06Th.rst b/Misc/NEWS.d/next/Library/2024-04-29-21-51-28.gh-issue-118402.Z_06Th.rst
new file mode 100644 (file)
index 0000000..25d7b45
--- /dev/null
@@ -0,0 +1,2 @@
+Fix :func:`inspect.signature` for the result of the
+:func:`functools.cmp_to_key` call.
index 406fcf0da2f7e42d36aa760c1de75b5eb5077ef7..e37473a582b55fba0f2cf0a7cda51288723911de 100644 (file)
@@ -571,6 +571,17 @@ static PyMemberDef keyobject_members[] = {
     {NULL}
 };
 
+static PyObject *
+keyobject_text_signature(PyObject *self, void *Py_UNUSED(ignored))
+{
+    return PyUnicode_FromString("(obj)");
+}
+
+static PyGetSetDef keyobject_getset[] = {
+    {"__text_signature__", keyobject_text_signature, (setter)NULL},
+    {NULL}
+};
+
 static PyObject *
 keyobject_call(keyobject *ko, PyObject *args, PyObject *kwds);
 
@@ -585,6 +596,7 @@ static PyType_Slot keyobject_type_slots[] = {
     {Py_tp_clear, keyobject_clear},
     {Py_tp_richcompare, keyobject_richcompare},
     {Py_tp_members, keyobject_members},
+    {Py_tp_getset, keyobject_getset},
     {0, 0}
 };