使用给定参数名动态生成Python函数
我想在Python3代码中创建函数,利用运行时提供的数据。我被困在如何按照使用给定参数名动态生成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',
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)
应该可以正常工作。另外,为什么不能简单地手工编写相应的函数签名呢?假设这些函数中的每一个都是唯一的,那么为什么需要生成它们呢?