2016-04-06 52 views
0

我一直在用這個來破解我的腦袋。使用字符串或字典來構建Python函數參數

鑑於這一功能:

def foo(param1, param2, param3): 
    print 'param1 =', param1 
    print 'param2 =', param2 
    print 'param3 =', param3 

是有可能做這樣的事情在Python?

string1 = 'param1' 
string2 = 'param2' 
string3 = 'param3' 

foo(string1='val1', string2='val2', string3='val3') # Uber magic 

或類似的東西?

params = { 
    'param1': 'val1', 
    'param2': 'val2', 
    'param3': 'val3' 
} 

foo(params) # Even ubener magic 

的所有法術的結果應該是相當於調用

foo(param1='val1', param2='val2', param3='val3') 

我沒有興趣在不斷變化的方式來支持**kwargs功能。

在此先感謝!

+1

你想要的第二個做什麼這是非常我不清楚。你能用言語解釋並給出一個明確的預期輸出,因爲tl; dr是所有這些東西都是可能的(沒有魔法:)) –

+0

這個想法是自動地讓解釋器將string1的值'param1'識別爲函數的param1參數,而不管我傳遞string1,string2或string3'參數'的順序。 –

+0

「我不想改變函數以支持'** kwargs'的方式」 - 該函數是否用'** kwargs'參數定義,與您是否可以將關鍵字參數傳遞給* * kwargs'。 – user2357112

回答

1
params = { 
    'param1': 'val1', 
    'param2': 'val2', 
    'param3': 'val3' 
} 

foo(**params) # Even ubener magic 

這被稱爲拆包字典...

+0

你也可以做'params = [「foo」,「bar」,「baz」]; foo(* params)'太... – MattDMo

+0

這個伎倆!非常感謝你! –

+0

@CiprianMandache如果這個答案[解決你的問題](http://stackoverflow.com/help/someone-answers),請考慮[接受它](http://meta.stackexchange。com/questions/5234),點擊答案左邊的複選標記/打勾,將其變成綠色。這標誌着您的問題已經解決,您的滿意,併爲您和回答者授予[聲譽](http://stackoverflow.com/help/whats-reputation)。在將問題標記爲已回答之前,可能有時間限制,但時間相對較短。 – MattDMo

2
>>> def foo(param1, param2, param3): 
    print param1, param2, param3 

>>> foo(*range(3)) 
0 1 2 
>>> foo(**dict(param1=1,param2=2,param3=3)) 
1 2 3 
0

正如@en_Knight指出,這些都是可以做到的

或者:

foo(param1='val1',param2='val2',param3='val3') 

或:

foo(**params) 

如果你想只指定一些變量,你可以給該功能默認變量(不會在這個確切的例子非常有用):

def foo(param1='', param2='', param3=''): 

,那麼你可以按任何順序指定它們或省略其中一些例如。

foo(param3=2,param1=2) 

但如果有些變量都沒有提及他們需要首先把參數名稱定義:

foo(3,param=4) #param1 = 3, param2 = '', param3 = 4 
相關問題