def get_args_kwargs_defaults(func):
'''Get the required args, defaults, and var keywords of func
Parameters
----------
func: callable
Returns
-------
tuple of 3 elements:
args: Positional argument names
kwargs: Keyword arguments and their defaults
takes_var_keywords: True if func takes variable keywords
Examples
--------
TODO
'''
if hasattr(inspect, 'signature'):
sig = inspect.signature(func) # Python 3
empty = inspect._empty
else:
import funcsigs
sig = funcsigs.signature(func) # Python 2
empty = funcsigs._empty
params = sig.parameters
kwargs = {}
args = []
takes_variable_keywords = None
for k, v in params.items():
if v.default != empty:
kwargs[k] = v.default
else:
args.append(k)
if v.kind == 4:
#<_ParameterKind.VAR_KEYWORD: 4>
takes_variable_keywords = k
'''sig = inspect.getargpsec(func) # Python 2
args = sig.args
kwargs = sig.keywords
called = None
for x in range(100):
test_args = (func,) + tuple(range(x))
try:
called = inspect.getcallargs(*test_args)
break
except:
pass
if called is None:
raise
'''
return args, kwargs, takes_variable_keywords
评论列表
文章目录