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


73

我想将所有传递给function(func1)的参数作为参数传递给func2内部的另一个function(),func1 这可以*args, *kwargs在被调用过程中完成func1并将它们传递给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



我不认为这有什么用处……
jcao219 2010年

1
它并没有那么有用,但是有时候我写了一个带有很多args的函数,并且无聊地一遍又一遍地复制它们。
roopesh 2010年

6
@ jcao219在编写不关心函数args的泛型装饰器时很有用
b0fh 2013年

2
@ jcao219-或如果您要提取其他功能的通用功能,而又不改变现有的外部呼叫接口
Marc

Answers:


60

显式比隐式更好,但是如果您真的不想键入一些字符,请执行以下操作:

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

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


8
这样做的缺点是,如果您在调用之前创建了局部变量func2,那么它们也将传递给func2
Ned Batchelder

3
也许您可以在功能开始时复制本地人?
Bwmat 2010年

现在我记得读过有关locals。我想的太多了vars(),记不得了locals()。应该已经阅读了文件。我猜也可以使用vars()。
roopesh 2010年

4
这对于类函数不起作用,因为它将为自身获取多个值
Bhaskar

4
哎呀,我讨厌这个。原因是locals()概念错误-您要传递“所有参数”而不是“所有局部变量”。各种无辜的更改(例如在此行之前添加局部变量,或者将函数移为方法,反之亦然)都可能破坏此代码。此外,读者必须抓紧脑袋弄清楚。
汤姆·斯威利


2

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

首先可以通过调用来规避此locals()问题,如下所示:

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

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

    func2(**par)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.