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

0 投票
1 回答
7114 浏览
提问于 2025-04-17 12:39

我在看一些关于为什么不应该在Python代码中使用exec或eval的问题。

我现在有一个基于Pyramid的Python网页程序,它从一个表单中获取一些变量,然后调用一个函数。这个函数的所有参数都是可选的,所以我大致上做的就是这样:

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。我找到了一篇这样的回答,作者建议传递一个字典作为引用,而不是使用我现在的解决方案。

所以我有几个问题:

  1. 你觉得这样做好吗?
  2. 我可以总是像作者提到的那样,把字典传递给任何函数吗?
  3. 我经常看到**这个符号,但我不太明白它的作用。你能给我一点提示,或者推荐一个好的页面让我学习一下吗?

1 个回答

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)

撰写回答