2012-02-09 109 views
0

我正在閱讀一些關於在Python代碼中不使用exec或eval的問題。通過引用傳遞字典,而不是使用eval /如何傳遞可變數量的參數

我目前有一個基於金字塔的python web程序,它需要一個窗體中的變量並調用一個函數。該功能或可選的所有參數,從而或多或少什麼,我要做的就是

command = 'function_to_be_called (' 

if optional_variable_in_form in request.params : 
    command += 'optional_variable=optional_variable_in_form' 

command += ')' 

i = eval (command) 

我想提高我的申請,我試圖取代EVAL別的東西。我發現this answer,作者建議通過引用傳遞字典,而不是使用我的解決方案。

所以我的問題是:

  1. 你認爲這是一個很好的路要走?
  2. 我可以隨時將作者建議的字典傳遞給任何函數嗎?
  3. 我發現相當**,但我不明白它的作用。你能給我一個暗示或者建議一個好的網頁,我可以研究它嗎?

回答

5

你可以這樣做:

function_to_be_called(**option_dict) 

舊的方式做到這一點是與apply功能,但現在已經過時了*args**keywords語法。

這其實是真的很酷,因爲這意味着你可以有一個功能和參數元組和調用函數,所以:

def polly(cracker, wants): 
    if wants: 
     print 'polly wants a', cracker 
f = polly 
t = ('cracker', True) 

現在這些都是等價的:

polly('cracker', True) 
polly(*('cracker', True)) 
polly(*t) 
f('cracker', True) 
f(*t) 

現在擴展關鍵字參數 - 但查找一個真正的教程。回答實際問題字符`D = {「餅乾」:「螺母」,「希望」:假}

polly(**{cracker: 'cracker', wants: True}) 
d = {cracker: 'biscuit', wants: True} 
polly(**d) 
+2

,更重要的是:但作爲@Duncan所指出的,你可以做到這一點''波利(** d)'也是等價的。 – Duncan 2012-02-09 09:38:41

+0

太棒了!謝謝。我想我放棄打字一半! – 2012-02-09 10:22:35

相關問題