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

Ott*_*ana 0 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)
Run Code Online (Sandbox Code Playgroud)

我正在尝试增强我的应用程序,我正在尝试用其他东西替换eval.我找到了这个答案,作者建议通过引用传递字典而不是使用我的解决方案.

所以我的问题是:

  1. 你觉得这是一个好方法吗?
  2. 我可以随时将作者提出的字典传递给任何函数吗?
  3. 我发现很多**,但我不太了解它的作用.你能给我一个暗示或建议一个好的页面,我可以研究它吗?

Dar*_*mas 5

你可以这样做:

function_to_be_called(**option_dict)
Run Code Online (Sandbox Code Playgroud)

执行此操作的旧方法是使用该apply函数,但现在已经不再使用*args**keywords语法.

这实际上非常酷,因为它意味着你可以拥有一个函数和一个参数元组并调用该函数,所以:

def polly(cracker, wants):
    if wants:
       print 'polly wants a', cracker
f = polly
t = ('cracker', True)
Run Code Online (Sandbox Code Playgroud)

这些现在都是等价的:

polly('cracker', True)
polly(*('cracker', True))
polly(*t)
f('cracker', True)
f(*t)
Run Code Online (Sandbox Code Playgroud)

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

polly(**{cracker: 'cracker', wants: True})
d = {cracker: 'biscuit', wants: True}
polly(**d)
Run Code Online (Sandbox Code Playgroud)

  • 更重要的是回答实际问题`d = {'cracker':'nut','want':False}``polly(**d)`也是等价的. (2认同)