inspect.signature: Make sure that if a callable object has '_patialmethod'
attribute, that attribute is an instance of 'functools.partialmethod'.
This commit is contained in:
parent
c45873e434
commit
0486f819c9
|
@ -1651,20 +1651,21 @@ def signature(obj):
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
# Unbound partialmethod (see functools.partialmethod)
|
if isinstance(partialmethod, functools.partialmethod):
|
||||||
# This means, that we need to calculate the signature
|
# Unbound partialmethod (see functools.partialmethod)
|
||||||
# as if it's a regular partial object, but taking into
|
# This means, that we need to calculate the signature
|
||||||
# account that the first positional argument
|
# as if it's a regular partial object, but taking into
|
||||||
# (usually `self`, or `cls`) will not be passed
|
# account that the first positional argument
|
||||||
# automatically (as for boundmethods)
|
# (usually `self`, or `cls`) will not be passed
|
||||||
|
# automatically (as for boundmethods)
|
||||||
|
|
||||||
wrapped_sig = signature(partialmethod.func)
|
wrapped_sig = signature(partialmethod.func)
|
||||||
sig = _signature_get_partial(wrapped_sig, partialmethod, (None,))
|
sig = _signature_get_partial(wrapped_sig, partialmethod, (None,))
|
||||||
|
|
||||||
first_wrapped_param = tuple(wrapped_sig.parameters.values())[0]
|
first_wrapped_param = tuple(wrapped_sig.parameters.values())[0]
|
||||||
new_params = (first_wrapped_param,) + tuple(sig.parameters.values())
|
new_params = (first_wrapped_param,) + tuple(sig.parameters.values())
|
||||||
|
|
||||||
return sig.replace(parameters=new_params)
|
return sig.replace(parameters=new_params)
|
||||||
|
|
||||||
if _signature_is_builtin(obj):
|
if _signature_is_builtin(obj):
|
||||||
return Signature.from_builtin(obj)
|
return Signature.from_builtin(obj)
|
||||||
|
|
|
@ -1983,6 +1983,11 @@ class TestSignatureObject(unittest.TestCase):
|
||||||
('c', 1, ..., 'keyword_only')),
|
('c', 1, ..., 'keyword_only')),
|
||||||
'spam'))
|
'spam'))
|
||||||
|
|
||||||
|
def test_signature_on_fake_partialmethod(self):
|
||||||
|
def foo(a): pass
|
||||||
|
foo._partialmethod = 'spam'
|
||||||
|
self.assertEqual(str(inspect.signature(foo)), '(a)')
|
||||||
|
|
||||||
def test_signature_on_decorated(self):
|
def test_signature_on_decorated(self):
|
||||||
import functools
|
import functools
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue