【问题标题】:Is it bad to use vars()使用 vars() 是不是很糟糕
【发布时间】:2011-10-06 09:45:28
【问题描述】:

我有一个字符串表达式,我需要对其进行 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})

谢谢!!

【问题讨论】:

  • 更大的问题:使用eval() 是个坏主意。你真正想做什么?

标签: python variables


【解决方案1】:

有一个更好的方法来做你想做的事情:eval 的可选 globalslocals 参数。

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

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

【讨论】:

  • 谢谢大家!是的,@MRAB 和 @murgatroid99 eval(e1,d1) 确实有效。但是为了能够使用模块中的某些功能,我必须按照@Zack 的建议使用 eval(e1, globals(),d1) 。但同样,传递全局变量不是一件冒险的事情吗??
  • 评估不受信任的字符串是冒险的事情。不通过全局变量并不会降低风险。
  • 您也可以使用相同的方法只允许您想要的功能。比使用所有全局变量更好。
  • 我有点同意你的看法@Rosh Oxymoron。谢谢@utdemir。这可能是更好的做法。但是现在, globals() 对我有用。再次感谢大家!!
【解决方案2】:

为什么不这样做:

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

【讨论】:

    【解决方案3】:

    根据this,看来你可以通过这样做得到同样的效果

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

    【讨论】:

      猜你喜欢
      • 2011-09-20
      • 2010-12-09
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      相关资源
      最近更新 更多