Skip to content

Commit 4e08fbc

Browse files
pythongh-93021: Fix __text_signature__ for __get__ (pythonGH-93023)
Because of the way wrap_descr_get is written, the second argument to __get__ methods implemented through the wrapper is always optional.
1 parent dd5cf84 commit 4e08fbc

File tree

3 files changed

+10
-2
lines changed

3 files changed

+10
-2
lines changed

Lib/test/test_types.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,12 @@ def test_slot_wrapper_types(self):
597597
self.assertIsInstance(object.__lt__, types.WrapperDescriptorType)
598598
self.assertIsInstance(int.__lt__, types.WrapperDescriptorType)
599599

600+
def test_dunder_get_signature(self):
601+
sig = inspect.signature(object.__init__.__get__)
602+
self.assertEqual(list(sig.parameters), ["instance", "owner"])
603+
# gh-93021: Second parameter is optional
604+
self.assertIs(sig.parameters["owner"].default, None)
605+
600606
def test_method_wrapper_types(self):
601607
self.assertIsInstance(object().__init__, types.MethodWrapperType)
602608
self.assertIsInstance(object().__str__, types.MethodWrapperType)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix the :attr:`__text_signature__` for :meth:`__get__` methods implemented
2+
in C. Patch by Jelle Zijlstra.

Objects/typeobject.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7184,7 +7184,7 @@ wrap_descr_get(PyObject *self, PyObject *args, void *wrapped)
71847184
obj = NULL;
71857185
if (type == Py_None)
71867186
type = NULL;
7187-
if (type == NULL &&obj == NULL) {
7187+
if (type == NULL && obj == NULL) {
71887188
PyErr_SetString(PyExc_TypeError,
71897189
"__get__(None, None) is invalid");
71907190
return NULL;
@@ -8209,7 +8209,7 @@ static slotdef slotdefs[] = {
82098209
TPSLOT("__next__", tp_iternext, slot_tp_iternext, wrap_next,
82108210
"__next__($self, /)\n--\n\nImplement next(self)."),
82118211
TPSLOT("__get__", tp_descr_get, slot_tp_descr_get, wrap_descr_get,
8212-
"__get__($self, instance, owner, /)\n--\n\nReturn an attribute of instance, which is of type owner."),
8212+
"__get__($self, instance, owner=None, /)\n--\n\nReturn an attribute of instance, which is of type owner."),
82138213
TPSLOT("__set__", tp_descr_set, slot_tp_descr_set, wrap_descr_set,
82148214
"__set__($self, instance, value, /)\n--\n\nSet an attribute of instance to value."),
82158215
TPSLOT("__delete__", tp_descr_set, slot_tp_descr_set,

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy