Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Python有办法通过函数传递参数吗_Javascript_Python - Fatal编程技术网

Javascript Python有办法通过函数传递参数吗

Javascript Python有办法通过函数传递参数吗,javascript,python,Javascript,Python,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中有没有一种简单的方法来做类似的事情 >>>

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中有没有一种简单的方法来做类似的事情

>>> def foo(*args):
...     return args

>>> foo(1,2,3)
(1,2,3)

这就是你想要的吗?

用*展开参数怎么样

>>> def foo(*args):
...     return bar(*(args[:3]))
>>> def bar(a, b, c):
...     return [a, b, c]
>>> foo(1, 2, 3, 4)
[1, 2, 3]

我认为这与您的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()
获取所有局部变量,因此您应该在方法开始时使用它,并在声明其他变量时复制它生成的字典。或者您可以使用中介绍的
检查
模块。

是的,这是我应该说的

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到条(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 **

Python的
*args
功能的行为方式与下一个Javascript标准化预期的
spread
rest
相同。对于
foo(a=1,b=2)
样式的关键字图,您可以使用
**
关键字扩展来捕获它们:
foo(**kwargs)
它将kwargs作为一个
dict
发送给另一个函数,任何dict都可以通过
bar(**kwargs)
作为关键字参数发送给另一个函数,你也可以混合匹配:
foo(a,b,*args)
或者
foo(a,b=None,**kargs)
在python 3中,
foo(a,b,*args,c=None,**kargs)
这几乎就是我想要的,但是我必须在定义中使用*args,我做不到:
def foo(a,b,c):返回条(*(args[:3])
我唯一能想到的就是在foo中使用
locals()
locals().values()
将为您提供传递给foo的所有参数,但它们的顺序不一致。@futuraprime实际上,请将其删除。基于参数的名称,它们的顺序是一致的(也就是说,只要您的参数被命名为a、b和c,它们的值就会以相同的顺序出现)。但是,在“a,b,c”的情况下,您会得到顺序为“a,c,b”的值。这似乎不值得费心。当@andrew的答案更简单、更通俗、直截了当时,这个答案是如何被接受的?我自己真的很惊讶。