mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Add sphinx.util.inspect:signature_from_ast()
This commit is contained in:
parent
c063c9c0fe
commit
a59f83b6bd
@ -527,10 +527,14 @@ def stringify_signature(sig: inspect.Signature, show_annotation: bool = True,
|
|||||||
def signature_from_str(signature: str) -> inspect.Signature:
|
def signature_from_str(signature: str) -> inspect.Signature:
|
||||||
"""Create a Signature object from string."""
|
"""Create a Signature object from string."""
|
||||||
module = ast.parse('def func' + signature + ': pass')
|
module = ast.parse('def func' + signature + ': pass')
|
||||||
definition = cast(ast.FunctionDef, module.body[0]) # type: ignore
|
function = cast(ast.FunctionDef, module.body[0]) # type: ignore
|
||||||
|
|
||||||
# parameters
|
return signature_from_ast(function)
|
||||||
args = definition.args
|
|
||||||
|
|
||||||
|
def signature_from_ast(node: ast.FunctionDef) -> inspect.Signature:
|
||||||
|
"""Create a Signature object from AST *node*."""
|
||||||
|
args = node.args
|
||||||
defaults = list(args.defaults)
|
defaults = list(args.defaults)
|
||||||
params = []
|
params = []
|
||||||
if hasattr(args, "posonlyargs"):
|
if hasattr(args, "posonlyargs"):
|
||||||
@ -580,7 +584,7 @@ def signature_from_str(signature: str) -> inspect.Signature:
|
|||||||
params.append(Parameter(args.kwarg.arg, Parameter.VAR_KEYWORD,
|
params.append(Parameter(args.kwarg.arg, Parameter.VAR_KEYWORD,
|
||||||
annotation=annotation))
|
annotation=annotation))
|
||||||
|
|
||||||
return_annotation = ast_unparse(definition.returns) or Parameter.empty
|
return_annotation = ast_unparse(node.returns) or Parameter.empty
|
||||||
|
|
||||||
return inspect.Signature(params, return_annotation=return_annotation)
|
return inspect.Signature(params, return_annotation=return_annotation)
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import _testcapi
|
import _testcapi
|
||||||
|
import ast
|
||||||
import datetime
|
import datetime
|
||||||
import functools
|
import functools
|
||||||
import sys
|
import sys
|
||||||
@ -350,6 +351,38 @@ def test_signature_from_str_invalid():
|
|||||||
inspect.signature_from_str('')
|
inspect.signature_from_str('')
|
||||||
|
|
||||||
|
|
||||||
|
def test_signature_from_ast():
|
||||||
|
signature = 'def func(a, b, *args, c=0, d="blah", **kwargs): pass'
|
||||||
|
tree = ast.parse(signature)
|
||||||
|
sig = inspect.signature_from_ast(tree.body[0])
|
||||||
|
assert list(sig.parameters.keys()) == ['a', 'b', 'args', 'c', 'd', 'kwargs']
|
||||||
|
assert sig.parameters['a'].name == 'a'
|
||||||
|
assert sig.parameters['a'].kind == Parameter.POSITIONAL_OR_KEYWORD
|
||||||
|
assert sig.parameters['a'].default == Parameter.empty
|
||||||
|
assert sig.parameters['a'].annotation == Parameter.empty
|
||||||
|
assert sig.parameters['b'].name == 'b'
|
||||||
|
assert sig.parameters['b'].kind == Parameter.POSITIONAL_OR_KEYWORD
|
||||||
|
assert sig.parameters['b'].default == Parameter.empty
|
||||||
|
assert sig.parameters['b'].annotation == Parameter.empty
|
||||||
|
assert sig.parameters['args'].name == 'args'
|
||||||
|
assert sig.parameters['args'].kind == Parameter.VAR_POSITIONAL
|
||||||
|
assert sig.parameters['args'].default == Parameter.empty
|
||||||
|
assert sig.parameters['args'].annotation == Parameter.empty
|
||||||
|
assert sig.parameters['c'].name == 'c'
|
||||||
|
assert sig.parameters['c'].kind == Parameter.KEYWORD_ONLY
|
||||||
|
assert sig.parameters['c'].default == '0'
|
||||||
|
assert sig.parameters['c'].annotation == Parameter.empty
|
||||||
|
assert sig.parameters['d'].name == 'd'
|
||||||
|
assert sig.parameters['d'].kind == Parameter.KEYWORD_ONLY
|
||||||
|
assert sig.parameters['d'].default == "'blah'"
|
||||||
|
assert sig.parameters['d'].annotation == Parameter.empty
|
||||||
|
assert sig.parameters['kwargs'].name == 'kwargs'
|
||||||
|
assert sig.parameters['kwargs'].kind == Parameter.VAR_KEYWORD
|
||||||
|
assert sig.parameters['kwargs'].default == Parameter.empty
|
||||||
|
assert sig.parameters['kwargs'].annotation == Parameter.empty
|
||||||
|
assert sig.return_annotation == Parameter.empty
|
||||||
|
|
||||||
|
|
||||||
def test_safe_getattr_with_default():
|
def test_safe_getattr_with_default():
|
||||||
class Foo:
|
class Foo:
|
||||||
def __getattr__(self, item):
|
def __getattr__(self, item):
|
||||||
|
Loading…
Reference in New Issue
Block a user