将函数的所有参数传递给另一个函数

roo*_*esh 62 python arguments function

我希望将传递给函数(func1)的所有参数作为参数传递给另一个函数(func2)里面func1 这可以*args, *kwargs在被调用中完成func1并传递给它们func2,但是还有另一种方法吗?

本来

def func1(*args, **kwargs):
    func2(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

但如果我的func1签名是

def func1(a=1, b=2, c=3):
Run Code Online (Sandbox Code Playgroud)

如何在不使用的情况下将它们全部发送到func2

def func1(a=1, b=2, c=3):
    func2(a, b, c)
Run Code Online (Sandbox Code Playgroud)

有没有像在JavaScript中的方式callee.arguments

Joc*_*zel 54

显式优于隐式,但如果你真的不想输入几个字符:

def func1(a=1, b=2, c=3):
    func2(**locals())
Run Code Online (Sandbox Code Playgroud)

locals()都是局部变量,所以你不能在调用之前设置任何额外的变量,func2否则它们也会被传递.

  • 这将有一个缺陷,如果你在调用`func2`之前创建了局部变量,那么它们也将被传递给`func2`. (6认同)
  • 这不适用于类函数,因为它将为self获取多个值 (3认同)
  • 也许你可以在函数的开头复制本地人? (2认同)
  • 哎呀,我讨厌这个.原因是`locals()`是错误的概念 - 你希望传递"所有参数"而不是"所有局部变量".各种无辜的变化 - 比如在此行之前添加局部变量,或者将函数移动为方法,反之亦然 - 可能会破坏此代码.更多的是,读者必须抓住头脑才能搞清楚. (2认同)

小智 13

如果func1的参数只是关键字参数,您可以这样做:

def func1(a=1, b=2, c=3):
    func2(**locals())
Run Code Online (Sandbox Code Playgroud)

  • 为什么只有关键字参数? (2认同)

Ols*_*ard 8

正如其他人所说,如果在调用之前创建新变量locals(),则 using 可能会导致您传递比预期更多的变量。func1()func2()

可以通过locals()首先调用并创建其内容的副本来避免这种情况,如下所示:

def func1(a=1, b=2,c=3):
    parameters = locals().copy()

    d = parameters ["a"] + parameters ["b"]

    func2(**parameters) #the value of `d` is not passed to func2.
Run Code Online (Sandbox Code Playgroud)

func2(**locals())如果我们像这样进行函数调用,d就会将其添加为参数。