function_pattern_matching.py 文件源码

python
阅读 26 收藏 0 点赞 0 评论 0

项目:function-pattern-matching 作者: rasguanabana 项目源码 文件源码
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
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号