Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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函数_Python_Python 3.x_Metaprogramming - Fatal编程技术网

使用给定参数名动态生成Python函数

使用给定参数名动态生成Python函数,python,python-3.x,metaprogramming,Python,Python 3.x,Metaprogramming,我想在Python3代码中创建函数,利用运行时提供的数据。我被困在如何按照 def foo(varname1, varname2): return varname1 + varname2 其中给出参数名称的字符串varname1和varname2被指定为某些构造函数的参数,例如: def makeNewFooFunc(varname1, varname2): # do magic return foo fooFunc = makeNewFooFunc('first',

我想在Python3代码中创建函数,利用运行时提供的数据。我被困在如何按照

def foo(varname1, varname2):
    return varname1 + varname2
其中给出参数名称的字符串
varname1
varname2
被指定为某些构造函数的参数,例如:

def makeNewFooFunc(varname1, varname2):
    # do magic
    return foo

fooFunc = makeNewFooFunc('first', 'second')

print(fooFunc(first=1, second=2))
# should return 3

什么是
#施展魔法
步骤?这是eval的工作,还是有其他选择?

您不需要编写这样的函数。 只需使用**kwargs

def foo_func(**kwargs):
    return sum(kwargs.values())

foo_func(any_name=1, any_name_2=2)
但是如果你仍然需要做你想做的事,你可以试试

def make_new_func(var_name_1, var_name_2):
    def foo(**kwargs):
        # make sure in kwargs only expected parameters
        assert set(kwargs) == {var_name_1,  var_name_2}
        return kwargs[var_name_1] + kwargs[var_name_2]
    return foo

foo_func = make_new_func('a', 'b')

foo_func(a=1, b=2)

您不需要编写这样的函数。 只需使用**kwargs

def foo_func(**kwargs):
    return sum(kwargs.values())

foo_func(any_name=1, any_name_2=2)
但是如果你仍然需要做你想做的事,你可以试试

def make_new_func(var_name_1, var_name_2):
    def foo(**kwargs):
        # make sure in kwargs only expected parameters
        assert set(kwargs) == {var_name_1,  var_name_2}
        return kwargs[var_name_1] + kwargs[var_name_2]
    return foo

foo_func = make_new_func('a', 'b')

foo_func(a=1, b=2)

为什么参数名很重要?在我看来,您可以只使用
**kwargs
,而无需使用该特定签名“生成函数”。@deceze在使用外部代码时询问函数并使用dict传递参数,因此重要的是参数名,不是它们的位置。外部代码正在检查函数签名并相应地更改其行为?@deceze不确定。我使用的是Flask Restful,with要求资源类具有get、post等方法,这些方法的参数名与资源url中变量名的名称相匹配。因此,它可能只是执行
您的_函数(**params)
,这意味着
定义您的_函数(**kwargs)
应该可以正常工作。另外,为什么不能简单地手工编写相应的函数签名呢?假设这些函数都是唯一的,那么为什么需要生成它们?为什么参数名很重要?在我看来,您可以只使用
**kwargs
,而无需使用该特定签名“生成函数”。@deceze在使用外部代码时询问函数并使用dict传递参数,因此重要的是参数名,不是它们的位置。外部代码正在检查函数签名并相应地更改其行为?@deceze不确定。我使用的是Flask Restful,with要求资源类具有get、post等方法,这些方法的参数名与资源url中变量名的名称相匹配。因此,它可能只是执行
您的_函数(**params)
,这意味着
定义您的_函数(**kwargs)
应该可以正常工作。另外,为什么不能简单地手工编写相应的函数签名呢?假设这些函数中的每一个都是唯一的,那么为什么需要生成它们呢?