Javascript在每个函数中都有一个构造不良但很方便的“arguments”变量,这样你就可以通过这样的函数传递参数:
function foo(a, b, c) {
return bar.apply(this, arguments);
}
function bar(a, b, c) {
return [a, b, c];
}
foo(2, 3, 5); // returns [2, 3, 5]
在Python中有一种简单的方法可以做类似的事情吗?
答案 0 :(得分:4)
>>> def foo(*args):
... return args
>>> foo(1,2,3)
(1,2,3)
是你想要的吗?
答案 1 :(得分:2)
如何使用*进行参数扩展?
>>> def foo(*args):
... return bar(*(args[:3]))
>>> def bar(a, b, c):
... return [a, b, c]
>>> foo(1, 2, 3, 4)
[1, 2, 3]
答案 2 :(得分:1)
我认为这与你的javascript片段非常相似。它不需要您更改功能定义。
>>> def foo(a, b, c):
... return bar(**locals())
...
>>> def bar(a, b, c):
... return [a, b, c]
...
>>> foo(2,3,5)
[2, 3, 5]
请注意locals()
获取所有局部变量,因此您应该在方法的开头使用它,并在声明其他变量时复制它生成的字典。或者,您可以按照this SO post中的说明使用inspect
模块。
答案 3 :(得分:1)
是的,这就是我应该说的。
def foo(*args):
return bar(*args)
您不需要使用(a,b,c)声明该函数。 bar(...)将获得foo(...)得到的任何东西。
我的另一个蹩脚的答案如下:
我非常接近回答“不,它不能轻易完成”,但有一些额外的线条,我认为它可以。 @cbrauchli使用locals()的好主意,但是因为locals()也返回局部变量,如果我们这样做
def foo(a,b,c):
n = "foobar" # any code that declares local variables will affect locals()
return bar(**locals())
我们将把不需要的第四个参数n传递给bar(a,b,c),我们会得到一个错误。要解决这个问题,你需要在第一行中做一些像arguments = locals()的东西,即
def foo(a, b, c):
myargs = locals() # at this point, locals only has a,b,c
total = a + b + c # we can do what we like until the end
return bar(**myargs) # turn the dictionary of a,b,c into a keyword list using **