Skip to content

Commit 17a8af9

Browse files
gh-118402: Fix inspect.signature() for functools.cmp_to_key() result (GH-118427)
1 parent 02887c6 commit 17a8af9

File tree

3 files changed

+23
-3
lines changed

3 files changed

+23
-3
lines changed

Lib/test/test_functools.py

+9-3
Original file line numberDiff line numberDiff line change
@@ -947,8 +947,13 @@ def mycmp(x, y):
947947
@unittest.skipIf(support.MISSING_C_DOCSTRINGS,
948948
"Signature information for builtins requires docstrings")
949949
def test_cmp_to_signature(self):
950-
self.assertEqual(str(Signature.from_callable(self.cmp_to_key)),
951-
'(mycmp)')
950+
sig = Signature.from_callable(self.cmp_to_key)
951+
self.assertEqual(str(sig), '(mycmp)')
952+
def mycmp(x, y):
953+
return y - x
954+
sig = Signature.from_callable(self.cmp_to_key(mycmp))
955+
self.assertEqual(str(sig), '(obj)')
956+
952957

953958

954959
@unittest.skipUnless(c_functools, 'requires the C _functools module')
@@ -1864,9 +1869,10 @@ def test_staticmethod(x):
18641869
self.assertIsNone(ref())
18651870

18661871
def test_common_signatures(self):
1867-
def orig(): ...
1872+
def orig(a, /, b, c=True): ...
18681873
lru = self.module.lru_cache(1)(orig)
18691874

1875+
self.assertEqual(str(Signature.from_callable(lru)), '(a, /, b, c=True)')
18701876
self.assertEqual(str(Signature.from_callable(lru.cache_info)), '()')
18711877
self.assertEqual(str(Signature.from_callable(lru.cache_clear)), '()')
18721878

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix :func:`inspect.signature` for the result of the
2+
:func:`functools.cmp_to_key` call.

Modules/_functoolsmodule.c

+12
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,17 @@ static PyMemberDef keyobject_members[] = {
571571
{NULL}
572572
};
573573

574+
static PyObject *
575+
keyobject_text_signature(PyObject *self, void *Py_UNUSED(ignored))
576+
{
577+
return PyUnicode_FromString("(obj)");
578+
}
579+
580+
static PyGetSetDef keyobject_getset[] = {
581+
{"__text_signature__", keyobject_text_signature, (setter)NULL},
582+
{NULL}
583+
};
584+
574585
static PyObject *
575586
keyobject_call(keyobject *ko, PyObject *args, PyObject *kwds);
576587

@@ -585,6 +596,7 @@ static PyType_Slot keyobject_type_slots[] = {
585596
{Py_tp_clear, keyobject_clear},
586597
{Py_tp_richcompare, keyobject_richcompare},
587598
{Py_tp_members, keyobject_members},
599+
{Py_tp_getset, keyobject_getset},
588600
{0, 0}
589601
};
590602

0 commit comments

Comments
 (0)