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

95
我想将传递给函数(func1)的所有参数作为参数传递给另一个函数(func2)在func1内部。 这可以通过在被调用的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,是否有类似的方法?


可能相关:https://dev59.com/EkjSa4cB1Zd3GeqPFXTT - Mark Elliot
我不认为这会有什么用处... - jcao219
1
有时候我写一个带有很多参数的函数,重复地一遍又一遍地复制它们感觉很无聊,虽然这并不是非常有用。 - roopesh
@Mark 不,没有关系,但还是谢谢。 - roopesh
9
@jcao219 这在编写不关心函数参数的通用装饰器时非常有用。 - b0fh
3
如果您要将公共功能提取到另一个函数中,并且不想更改现有的外部调用接口,那么请使用本文中提供的方法进行操作。请注意,在提取该功能时,应确保它在外部的行为与以前相同。 - Marc
3个回答

73

显式优于隐式,但如果您真的不想打几个字符:

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

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


12
如果在调用 func2 之前已经创建了本地变量,那么这将存在一个缺陷,这些本地变量也会被传递给 func2 - Ned Batchelder
5
或许你可以在函数一开始处复制本地变量? - Bwmat
6
对于类函数,这种方法行不通,因为它会导致self获得多个值。 - Bhaskar
@Bhaskar:有什么解决办法吗? - orome
14
哎呀,我讨厌这个。原因是locals()这个概念是错误的——你要传递“所有参数”,而不是“所有本地变量”。各种无辜的改变——比如在这一行之前添加一个本地变量,或将函数移动为方法或反之——都可能破坏这段代码。而且,读者还需要费力思考才能理解它。 - Tom Swirly
显示剩余3条评论

13

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

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

2
为什么只有关键字参数? - Hacker

7

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

可以通过首先调用locals()来规避这个问题,像这样:

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

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

    func2(**par)

这个方法无法按预期工作,因为parameters是对locals()的引用,它将始终显示相同的内容。对func2的调用将同时具有parametersd作为参数。要使用这种方法,您需要将函数的第一行更改为parameters = locals().copy()。这将获得初始locals()内容的副本,并且只要您不修改参数本身,它将保持不变。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接