假设我有以下功能
def f(x,y,**kwargs):
if 'z' in kwargs:
z = kwargs['z']
else:
z = 0
print(x + y + z)
带有两个参数和一个可选的关键字参数。我现在想得到一个函数g,它与f一样,但是z的值是预先确定的。因此,我可以做以下
def g(x,y):
z = 3
f(x,y, z = 3)
但是,如果我不知道f所采用的非关键字参数的数量,我该怎么办?我可以通过
获取这些参数的列表args = inspect.getargspec(f)[0]
但是,如果我现在将g定义为
g(args):
z = 3
f(args, z=z)
这当然不起作用,因为只有一个强制性参数传递给f。我该如何解决这个问题?也就是说,如果我有一个带有关键字参数的函数,那么如何定义一个完全相同的第二个函数,期望关键字参数采用预先确定的值?
答案 0 :(得分:1)
你有几个选择:
使用varargs定义g
:
def g(*args):
return f(*args, z=3)
或者,如果您还需要关键字参数:
def g(*args, **kwargs):
kwargs['z'] = 3
return f(*args, **kwargs)
import functools
g = functools.partial(f, z=3)
另请参阅此相关问题:Python Argument Binders。
答案 1 :(得分:0)
您可以使用functools.partial
来实现此目标
import functools
f = functools.partial(f, z=2)
# the following example is the usage of partial function f
x = f(1, 2)
y = f(1, 2, k=3)
z = f(1, 2, z=4)