通过引用传递字典而不是使用eval /如何传递可变数量的参数

时间:2012-02-09 09:28:43

标签: python eval pyramid

我正在阅读一些关于不在python代码中使用exec或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. 我发现了**,但我不太了解它的作用。你能给我一些暗示或建议一个好的页面,我可以研究它吗?

1 个答案:

答案 0 :(得分: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)

现在扩展关键字参数 - 但查找一个真正的教程。但正如@Duncan指出的那样,你可以这样做:

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