Python 使用vars()不好吗

Python 使用vars()不好吗,python,variables,Python,Variables,我需要对一个字符串表达式进行求值。此表达式可能具有给定字典中的键名,这些键的值可能是字符串,也可能不是字符串。为了让我的eval能够计算这些名称,我创建了带有该dict中出现的键名称的变量,并从dict中为其赋值,如下例所示。但是根据我所读到的,应该使用vars()。这让我担心我实施的计划的稳定性和风险。对于如何更好地实现这一点,有什么想法或建议吗 def test(e1,d1): for k,v in d1.iteritems(): if k in e1: vars

我需要对一个字符串表达式进行求值。此表达式可能具有给定字典中的键名,这些键的值可能是字符串,也可能不是字符串。为了让我的eval能够计算这些名称,我创建了带有该dict中出现的键名称的变量,并从dict中为其赋值,如下例所示。但是根据我所读到的,应该使用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})
谢谢

为什么不这样做:

>>> eval('x+y', {'x':1, 'y':2})
3
根据,看起来你可以通过这样做得到同样的效果

def test(e1, d1):
  return eval(e1, locals=d1)

有一种更好的方法来完成您要做的事情:可选的
globals
locals
参数到
eval

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

执行与代码相同的操作,但无需使用
vars
。如果您可以将空字典作为第二个参数而不是
globals()
,这将使您免受
e1

的副作用,谢谢大家!是的,@MRAB和@murgatroid99 eval(e1,d1)确实有效。但是为了能够使用模块中的一些函数,我必须使用@Zack建议的eval(e1,globals(),d1)。但是,传递globals不是一件冒险的事情吗?评估不受信任的字符串是一件冒险的事情。不传递全局变量并不会降低风险,而且您可以使用相同的方法只允许您想要的函数。比使用所有的globals更好。我有点同意you@Rosh矛盾修饰法。谢谢@utdemir。这可能是一件更好的事情。但就目前而言,globals()适合我。再次感谢大家!!更大的问题:使用
eval()
是个坏主意。你到底想干什么?