通过引用传递字典而不是使用eval / 如何传递可变数量的参数
我在看一些关于为什么不应该在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 个回答
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)