2012-02-09 41 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

相关问题