2012-03-29 66 views
2

的Javascript一個製作粗糙的,但方便的「論據」各項功能,這樣你可以通過函數傳遞參數,像這樣的內部變量:確實的Python有辦法通過函數傳遞參數

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中做類似事情的簡單方法?

回答

1

是的,這是我應該說的。

def foo(*args): 
    return bar(*args) 

您不需要用(a,b,c)聲明函數。酒吧(...)將獲得任何foo(...)獲得。

我的其他crummier的回答是以下:


我是如此接近回答「不,這不容易做到」,但有一些多餘的線條,我覺得還可以。 @cbrauchli偉大的想法用當地人(),但由於當地人()也返回局部變量,如果我們做

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 ** 
+0

當@ andrew的一個更簡單,更多Pythonic並且直截了當時,這個答案是如何被接受的? – ereOn 2014-05-22 06:10:32

+0

我真的很驚訝自己。 – pagga 2015-03-10 06:02:19

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

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

是你想要的嗎?

+0

Python的'* args'功能的行爲就像'spread'和'rest'接下來的JavaScript標準化。 – 2012-03-29 00:40:01

+2

也可用於風格'foo(a = 1,b = 2)'的關鍵詞詞組'',您可以使用'**'關鍵字擴展:'foo(** kwargs)'來捕獲它們,這可以讓kwargs成爲'dict'任何字典都可以通過'bar(** kwargs)' – 2012-03-29 01:04:03

+0

作爲關鍵字參數發送到另一個函數,您還可以混合匹配:'foo(a,b,* args)'或'foo(a,b = None, ** kargs)'或甚至在python 3中,'foo(a,b,* args,c = None,** kargs)' – 2012-03-29 01:08:42

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] 
+0

這幾乎是我想要的,但我必須在定義中使用* args - 我不能這樣做: 'def foo(a,b,c): return bar(*(args [:3]))' – futuraprime 2012-03-29 00:45:10

+0

我能想到的唯一事情就是使用locals()在foo裏。 'locals()。values()'會給你所有傳遞給foo的參數,但它們不會保持一致。 – 2012-03-29 02:01:11

+0

@futuraprime其實,從頭開始。它們將基於參數名稱的一致順序(也就是說,只要您的參數被命名爲a,b和c,它們的值將以相同的順序出現)。但是,在「a,b,c」的情況下,您可以按照「a,c,b」的順序獲取值。似乎這不值得麻煩。 – 2012-03-29 02:20:44

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()得到所有的局部變量,所以你應該在方法的開始使用它,讓你聲明其他變量它產生的字典的副本。或者,您可以使用inspect模塊,如this SO post中所述。