Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 规范化args和kwargs到kwarg规范型_Python_Variadic Functions - Fatal编程技术网

Python 规范化args和kwargs到kwarg规范型

Python 规范化args和kwargs到kwarg规范型,python,variadic-functions,Python,Variadic Functions,我对posarg标准形式提出了类似的问题 任何可能的参数都应转换为关键字形式,根据is运算符、id或类似运算符的结果省略默认值 例如: def myfunc(a, b=None, **kwargs): pass def canonicalize(func, *args, **kwargs): something = inspect.signature(func) # Do something with args/kwargs here return new_ar

我对posarg标准形式提出了类似的问题

任何可能的参数都应转换为关键字形式,根据
is
运算符、
id
或类似运算符的结果省略默认值

例如:

def myfunc(a, b=None, **kwargs):
    pass

def canonicalize(func, *args, **kwargs):
    something = inspect.signature(func)
    # Do something with args/kwargs here
    return new_args, new_kwargs
示例输出:

>>> canonicalize(myfunc, 1, 2, g=3)
(1,), {'b': 2, 'g': 3}
>>> canonicalize(myfunc, 1)
(1,), {}
>>> canonicalize(myfunc, 1, b=2)
(1,), {'b': 2}
>>> canonicalize(myfunc, 1, g=3, b=None)
(1,), {'g': 3}

您可以使用以下函数-您基本上可以将具有默认值的参数移动到**kwargs中的任何参数中(如果它实际上没有指定给自己的默认值):


谢谢比我希望的要残忍一点,但它奏效了@哈米尔阿巴斯是的。。。找不到更优雅的方式,因为您所追求的并不是Python内部的排序方式。。。不过,如果你找到了一个更优雅的方法-请随意分享!
import inspect

def canonicalize(f, *args, **kwargs):
    sig = inspect.signature(f)
    bargs = sig.bind(*args, **kwargs)
    # Pop out the named kwargs variable defaulting to {}
    ret_kwargs = bargs.arguments.pop(inspect.getfullargspec(f).varkw, {})
    # For all possible signature values
    for k, v in sig.parameters.items():
        # If the name exists in the bound arguments and has a default value
        if k in bargs.arguments and v.default is not inspect.Parameter.empty:
            # Remove from the bound arguments dict
            val = bargs.arguments.pop(k)
            # If the value isn't the same as the default value add it to ret_kwargs
            if val is not v.default:
                ret_kwargs[k] = val

    # bargs.args here will be made up of what's left in bargs.arguments
    return bargs.args, ret_kwargs