我正在阅读一些关于不在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,作者建议通过引用传递字典而不是使用我的解决方案。
所以我的问题是:
答案 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)