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

Posted

技术标签:

【中文标题】将一个函数的所有参数传递给另一个函数【英文标题】:Passing all arguments of a function to another function 【发布时间】:2011-03-09 09:24:34 【问题描述】:

我想将传递给函数(func1) 的所有参数作为参数传递给func1 内的另一个函数(func2) 这可以通过被调用的func1 中的*args, *kwargs 来完成,并将它们传递给func2,但是还有其他方法吗?

原来

def func1(*args, **kwargs):
    func2(*args, **kwargs)

但如果我的 func1 签名是

def func1(a=1, b=2, c=3):

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

def func1(a=1, b=2, c=3):
    func2(a, b, c)

有没有像javascript callee.arguments那样的方法?

【问题讨论】:

可能相关:***.com/questions/1136673/… 我看不出这有什么用... 它并不是那么有用,但有时我会编写一个带有很多参数的函数,并且厌倦了一遍又一遍地复制它们。 @jcao219 这在编写不关心函数参数的通用装饰器时很有用 @jcao219 - 或者如果您将通用功能提取到另一个功能,并且您不需要更改现有的外部调用接口 【参考方案1】:

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

这可以通过调用locals() 作为第一件事来规避,如下所示:

def func1(a=1, b=2,c=3):
    par = locals()

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

    func2(**par)

【讨论】:

【参考方案2】:

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

def func1(a=1, b=2, c=3):
    func2(**locals())

【讨论】:

【参考方案3】:

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

def func1(a=1, b=2, c=3):
    func2(**locals())

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

【讨论】:

这会有一个缺陷,如果你在调用func2之前创建了局部变量,那么它们也会被传递给func2 也许你可以在函数的开头复制本地人? 现在我记得读过关于locals 的文章。我对vars() 想太多了,想不起来locals()。应该读过文件。我想 vars() 也可以使用。 这不适用于类函数,因为它会为 self 获取多个值 哎呀,我讨厌这个。原因是locals() 是错误的概念——你想传递“所有参数”而不是“所有局部变量”。各种无害的更改——比如在这一行之前添加一个局部变量,或者将一个函数移动为一个方法,反之亦然——都可能破坏这段代码。此外,读者必须挠头才能弄明白。

以上是关于将一个函数的所有参数传递给另一个函数的主要内容,如果未能解决你的问题,请参考以下文章

将可变参数函数模板参数传递给另一个函数

如何将带有 args 的成员函数作为参数传递给另一个成员函数?

怎么将可变参数的函数的参数传递给另一个可变参数的函数

将带参数的函数传递给Python中的另一个函数?

如何将传递给我的 bash 脚本的所有参数传递给我的函数? [复制]

如何将引用函数传递给另一个函数