使用一个函数的参数作为其他函数的参数

时间:2018-06-04 10:06:05

标签: python arguments keyword keyword-argument

假设我有以下功能

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。我该如何解决这个问题?也就是说,如果我有一个带有关键字参数的函数,那么如何定义一个完全相同的第二个函数,期望关键字参数采用预先确定的值?

2 个答案:

答案 0 :(得分:1)

你有几个选择:

  1. 使用varargs定义g

    def g(*args):
        return f(*args, z=3)
    

    或者,如果您还需要关键字参数:

    def g(*args, **kwargs):
        kwargs['z'] = 3
        return f(*args, **kwargs)
    
  2. 使用functools.partial

    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)