使用vars()是不是很糟糕

时间:2011-07-15 18:43:26

标签: python variables

我有一个我需要进行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})

谢谢!

3 个答案:

答案 0 :(得分:2)

为什么不这样做:

>>> eval('x+y', {'x':1, 'y':2})
3

答案 1 :(得分:2)

有一种更好的方法可以执行您要执行的操作:globals的可选localseval参数。

def test(e1, d1):
    return eval(e1, globals(), d1)

与您的代码完全相同,但不需要使用vars。如果您可以通过将空字典作为第二个参数而不是globals()来传播,那将使您免于e1的副作用。

答案 2 :(得分:1)

根据this,看起来你可以通过

获得相同的效果
def test(e1, d1):
  return eval(e1, locals=d1)