summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2022-06-21 20:31:57 (GMT)
committerGitHub <noreply@github.com>2022-06-21 20:31:57 (GMT)
commita1565a80efe30c065d43d84623cc615ea00b9f76 (patch)
tree91e1d2b9663cb9c3fb97699c0c2a5446914d20c9
parent736f545cd323f9682c6d87ee1570d90a5598fda4 (diff)
downloadcpython-a1565a80efe30c065d43d84623cc615ea00b9f76.zip
cpython-a1565a80efe30c065d43d84623cc615ea00b9f76.tar.gz
cpython-a1565a80efe30c065d43d84623cc615ea00b9f76.tar.bz2
gh-93021: Fix __text_signature__ for __get__ (GH-93023) (GH-94085)
Because of the way wrap_descr_get is written, the second argument to __get__ methods implemented through the wrapper is always optional. (cherry picked from commit 4e08fbcfdfa57ea94091aabdd09413708e3fb2bf) Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
-rw-r--r--Lib/test/test_types.py6
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2022-05-20-09-25-34.gh-issue-93021.k3Aji2.rst2
-rw-r--r--Objects/typeobject.c4
3 files changed, 10 insertions, 2 deletions
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index cde9dad..8556ca3 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -597,6 +597,12 @@ class TypesTests(unittest.TestCase):
self.assertIsInstance(object.__lt__, types.WrapperDescriptorType)
self.assertIsInstance(int.__lt__, types.WrapperDescriptorType)
+ def test_dunder_get_signature(self):
+ sig = inspect.signature(object.__init__.__get__)
+ self.assertEqual(list(sig.parameters), ["instance", "owner"])
+ # gh-93021: Second parameter is optional
+ self.assertIs(sig.parameters["owner"].default, None)
+
def test_method_wrapper_types(self):
self.assertIsInstance(object().__init__, types.MethodWrapperType)
self.assertIsInstance(object().__str__, types.MethodWrapperType)
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-20-09-25-34.gh-issue-93021.k3Aji2.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-20-09-25-34.gh-issue-93021.k3Aji2.rst
new file mode 100644
index 0000000..8fdd8df
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-20-09-25-34.gh-issue-93021.k3Aji2.rst
@@ -0,0 +1,2 @@
+Fix the :attr:`__text_signature__` for :meth:`__get__` methods implemented
+in C. Patch by Jelle Zijlstra.
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 1fcc045..c5e832d 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -7025,7 +7025,7 @@ wrap_descr_get(PyObject *self, PyObject *args, void *wrapped)
obj = NULL;
if (type == Py_None)
type = NULL;
- if (type == NULL &&obj == NULL) {
+ if (type == NULL && obj == NULL) {
PyErr_SetString(PyExc_TypeError,
"__get__(None, None) is invalid");
return NULL;
@@ -8043,7 +8043,7 @@ static slotdef slotdefs[] = {
TPSLOT("__next__", tp_iternext, slot_tp_iternext, wrap_next,
"__next__($self, /)\n--\n\nImplement next(self)."),
TPSLOT("__get__", tp_descr_get, slot_tp_descr_get, wrap_descr_get,
- "__get__($self, instance, owner, /)\n--\n\nReturn an attribute of instance, which is of type owner."),
+ "__get__($self, instance, owner=None, /)\n--\n\nReturn an attribute of instance, which is of type owner."),
TPSLOT("__set__", tp_descr_set, slot_tp_descr_set, wrap_descr_set,
"__set__($self, instance, value, /)\n--\n\nSet an attribute of instance to value."),
TPSLOT("__delete__", tp_descr_set, slot_tp_descr_set,