【问题标题】:Use arguments of one function as arguments for other function使用一个函数的参数作为另一个函数的参数
【发布时间】:2018-11-13 15:23:26
【问题描述】:

假设我有以下功能

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

【问题讨论】:

  • 如果在f中的args前加一个*,比如f(*args, z=z),应该可以吗?

标签: python arguments keyword keyword-argument


【解决方案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

【讨论】:

  • 感谢您的回答,但这还不是我所希望的。在我的第一个示例中,参数的数量是已知的,结果函数 g 没有可变参数或关键字参数。但是,在您的第一个示例中,您有可变参数,而在第二个示例中,您有 kwargs。
  • @lbf_1994 你为什么关心g 是否有可变参数?如果您传递的参数太少或太多,它仍然会抛出应有的错误。
【解决方案2】:

你可以使用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)

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 2016-07-21
    • 1970-01-01
    • 2015-12-24
    • 2013-07-10
    • 2013-03-20
    • 2018-07-30
    • 2019-02-19
    相关资源
    最近更新 更多