mirror of
https://github.com/python/cpython.git
synced 2025-09-29 19:56:59 +00:00
This commit is contained in:
parent
cf58dfb44c
commit
e45ea377b8
3 changed files with 48 additions and 4 deletions
|
@ -2241,11 +2241,16 @@ def _signature_from_callable(obj, *,
|
||||||
sigcls=sigcls)
|
sigcls=sigcls)
|
||||||
|
|
||||||
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())
|
if first_wrapped_param.kind is Parameter.VAR_POSITIONAL:
|
||||||
|
# First argument of the wrapped callable is `*args`, as in
|
||||||
return sig.replace(parameters=new_params)
|
# `partialmethod(lambda *args)`.
|
||||||
|
return sig
|
||||||
|
else:
|
||||||
|
sig_params = tuple(sig.parameters.values())
|
||||||
|
assert first_wrapped_param is not sig_params[0]
|
||||||
|
new_params = (first_wrapped_param,) + sig_params
|
||||||
|
return sig.replace(parameters=new_params)
|
||||||
|
|
||||||
if isfunction(obj) or _signature_is_functionlike(obj):
|
if isfunction(obj) or _signature_is_functionlike(obj):
|
||||||
# If it's a pure Python function, or an object that is duck type
|
# If it's a pure Python function, or an object that is duck type
|
||||||
|
|
|
@ -1989,6 +1989,41 @@ class TestSignatureObject(unittest.TestCase):
|
||||||
('kwargs', ..., int, "var_keyword")),
|
('kwargs', ..., int, "var_keyword")),
|
||||||
...))
|
...))
|
||||||
|
|
||||||
|
def test_signature_without_self(self):
|
||||||
|
def test_args_only(*args): # NOQA
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test_args_kwargs_only(*args, **kwargs): # NOQA
|
||||||
|
pass
|
||||||
|
|
||||||
|
class A:
|
||||||
|
@classmethod
|
||||||
|
def test_classmethod(*args): # NOQA
|
||||||
|
pass
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def test_staticmethod(*args): # NOQA
|
||||||
|
pass
|
||||||
|
|
||||||
|
f1 = functools.partialmethod((test_classmethod), 1)
|
||||||
|
f2 = functools.partialmethod((test_args_only), 1)
|
||||||
|
f3 = functools.partialmethod((test_staticmethod), 1)
|
||||||
|
f4 = functools.partialmethod((test_args_kwargs_only),1)
|
||||||
|
|
||||||
|
self.assertEqual(self.signature(test_args_only),
|
||||||
|
((('args', ..., ..., 'var_positional'),), ...))
|
||||||
|
self.assertEqual(self.signature(test_args_kwargs_only),
|
||||||
|
((('args', ..., ..., 'var_positional'),
|
||||||
|
('kwargs', ..., ..., 'var_keyword')), ...))
|
||||||
|
self.assertEqual(self.signature(A.f1),
|
||||||
|
((('args', ..., ..., 'var_positional'),), ...))
|
||||||
|
self.assertEqual(self.signature(A.f2),
|
||||||
|
((('args', ..., ..., 'var_positional'),), ...))
|
||||||
|
self.assertEqual(self.signature(A.f3),
|
||||||
|
((('args', ..., ..., 'var_positional'),), ...))
|
||||||
|
self.assertEqual(self.signature(A.f4),
|
||||||
|
((('args', ..., ..., 'var_positional'),
|
||||||
|
('kwargs', ..., ..., 'var_keyword')), ...))
|
||||||
@cpython_only
|
@cpython_only
|
||||||
@unittest.skipIf(MISSING_C_DOCSTRINGS,
|
@unittest.skipIf(MISSING_C_DOCSTRINGS,
|
||||||
"Signature information for builtins requires docstrings")
|
"Signature information for builtins requires docstrings")
|
||||||
|
|
|
@ -51,6 +51,10 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- bpo-30149: inspect.signature() now supports callables with
|
||||||
|
variable-argument parameters wrapped with partialmethod.
|
||||||
|
Patch by Dong-hee Na.
|
||||||
|
|
||||||
- bpo-29931: Fixed comparison check for ipaddress.ip_interface objects.
|
- bpo-29931: Fixed comparison check for ipaddress.ip_interface objects.
|
||||||
Patch by Sanjay Sundaresan.
|
Patch by Sanjay Sundaresan.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue