def _getfullargspec_p(func):
"""Gets uniform full arguments specification of func, portably."""
try:
sig = inspect.signature(func)
sig_params = sig.parameters
except AttributeError: # signature method not available
# try getfullargspec is present (pre 3.3)
try:
arg_spec = inspect.getfullargspec(func)
except AttributeError: # getfullargspec method not available
arg_spec = inspect.getargspec(func) # py2, trying annotations will fail.
else: # continue conversion for py >=3.3
arg_spec = SimpleNamespace() # available since 3.3, just like signature, so it's ok to use it here.
def _arg_spec_helper(kinds=(), defaults=False, kwonlydefaults=False, annotations=False):
for arg_name, param in sig_params.items():
if not defaults and not kwonlydefaults and not annotations and param.kind in kinds:
yield arg_name
elif sum((defaults, kwonlydefaults, annotations)) > 1:
raise ValueError("Only one of 'defaults', 'kwonlydefaults' or 'annotations' can be True simultaneously")
elif annotations and param.annotation is not inspect._empty:
yield (arg_name, param.annotation)
elif param.default is not inspect._empty:
if defaults and param.kind in (p_kind.POSITIONAL_OR_KEYWORD, p_kind.POSITIONAL_ONLY):
yield param.default
elif kwonlydefaults and param.kind is p_kind.KEYWORD_ONLY:
yield (arg_name, param.default)
arg_spec.args = tuple(_arg_spec_helper((p_kind.POSITIONAL_OR_KEYWORD, p_kind.POSITIONAL_ONLY)))
arg_spec.varargs = six.next(_arg_spec_helper((p_kind.VAR_POSITIONAL,)), None)
arg_spec.kwonlyargs = tuple(_arg_spec_helper((p_kind.KEYWORD_ONLY,)))
arg_spec.varkw = six.next(_arg_spec_helper((p_kind.VAR_KEYWORD,)), None)
arg_spec.keywords = arg_spec.varkw # getargspec compat
arg_spec.defaults = tuple(_arg_spec_helper(defaults=True)) or None
arg_spec.kwonlydefaults = dict(_arg_spec_helper(kwonlydefaults=True))
arg_spec.annotations = dict(_arg_spec_helper(annotations=True))
if sig.return_annotation is not inspect._empty:
arg_spec.annotations['return'] = sig.return_annotation
return arg_spec
function_pattern_matching.py 文件源码
python
阅读 26
收藏 0
点赞 0
评论 0
评论列表
文章目录