我有一个我需要进行eval的字符串表达式。此表达式可能具有来自给定字典的键名,并且这些键的值可能是也可能不是字符串。为了让我的eval能够评估这些名称,我使用出现在该dict中的键名创建变量,并从dict中为其赋值,如下例所示。但是根据我所读的here,应该使用vars()。这让我担心我所实施的稳定性和风险。有关如何更好地实现这一目标的任何想法或建议吗?
def test(e1,d1):
for k,v in d1.iteritems():
if k in e1:
vars()[k]=v
return eval(e1)
test('x+y', {'x':1, 'y':2})
谢谢!
答案 0 :(得分:2)
为什么不这样做:
>>> eval('x+y', {'x':1, 'y':2})
3
答案 1 :(得分:2)
有一种更好的方法可以执行您要执行的操作:globals
的可选locals
和eval
参数。
def test(e1, d1):
return eval(e1, globals(), d1)
与您的代码完全相同,但不需要使用vars
。如果您可以通过将空字典作为第二个参数而不是globals()
来传播,那将使您免于e1
的副作用。
答案 2 :(得分:1)
根据this,看起来你可以通过
获得相同的效果def test(e1, d1):
return eval(e1, locals=d1)