2012-04-13 109 views
1
def myfunc(a,b=2): 
    print("Called with", a, b) 
    return 
p1 = functools.partial(myfunc, b=4) 
p1("foobar", 4) 

爲什麼我運行最後一行時出現語法錯誤?它適用,如果我這樣做:myfunc("foobar", 4)爲什麼在Python中這不可能?

+0

Partial創建一個新函數,該函數使用一些預定義參數調用舊函數,然後使用與原始函數相同數量的參數調用部分函數是沒有意義的。只是不要通過4,它會按照你的意圖工作。 – 2012-04-13 13:46:10

+0

沒有語法錯誤,你的意思是'TypeError'? – delnan 2012-04-13 13:49:02

回答

4

'偏'已經設置'b'爲4;如果你想你應該明確地設置參數「B」的另一個值:

>>> p1("foobar") 
('Called with', 'foobar', 4) 

>>> p1("foobar", b=5) 
('Called with', 'foobar', 5) 
+0

我覺得對於一個初學Python的人來說,你的回答太神祕了。你能解釋一下爲什麼一個「應該明確地設置參數'b'」嗎?問題中的第一個詞是「爲什麼」,而不是如何。 – 2012-04-13 13:45:17

+0

你說得對。儘管使用'partial'並不適合初學者...... – Don 2012-04-13 13:47:31

+2

@Bryan個人而言,我不認爲Python中的初學者應該使用partial,至少如果它們不是來自功能性背景的話。並試圖做'部分(func,b = 5)(a,b = 4)'聽起來好像我們試圖解決錯誤的問題。爲什麼要在那裏部分地使用? – Voo 2012-04-13 13:59:05

0

因爲你是一個bfunctools.partial調用中提供它。 您的電話應該是這樣的:

p1("foobar") 

,或者你可以只得到p1 = functools.partial(myfunc, b=4)擺脫b=4,使其類似:

p1 = functools.partial(myfunc) 
+0

爲什麼使一個沒有參數的部分?只要做''p1 = myfunc''。 – 2012-04-13 13:47:32

+1

(我編輯過你的文章,所以代碼塊格式正確:)有關於如何讓它在這裏工作的詳細信息: – huon 2012-04-13 13:50:58

+0

謝謝我在這裏很新 – 2012-04-13 17:32:28

0

我想這是因爲Python允許您使用可選的參數任何訂單。當您使用更多的靜態類型語言時,通常會按照函數/方法中定義的順序使用可選參數。因此,例如,在Python這是合法的:

def myfunc(a=1,b=2,c=3): 
    print a,b,c 

myfunc(c=99, b=13, a=12) 

因爲你可以按任何順序指定可選參數,我認爲Python明確需要知道哪些參數被分配到本地函數變量。

相關問題