eval()总是错的吗?

时间:2012-08-01 21:50:27

标签: python eval

我知道应避免使用eval()和exec(),但在这种情况下它似乎是最好的选择:我从wxPython中的复选框和文本框中获取值并将它们放入我的配置类中。以下是我使用eval()的方法:

config = wx.Config()
checkBoxes = ['option_1', 'option_2']
for key in checkBoxes:
    config.Write(key, str(eval('self.m_checkBox_'+key+'.GetValue()'))

没有任何安全问题,因为eval没有任何用户输入,对我来说似乎很清楚。有更好的方法吗?

5 个答案:

答案 0 :(得分:6)

怎么样:

config = wx.Config()
checkBoxes = {'option_1': m_checkBox_option_1, 
              'option_2': m_checkBox_option_2}
for checkbox in checkBoxes:
    config.Write(checkbox, str(checkBoxes[checkbox].Value()))

答案 1 :(得分:5)

config = wx.Config()
checkBoxes = ['option_1', 'option_2']
for key in checkBoxes:
    config.Write(key, str(getattr(self, 'm_checkBox_'+key).Value()))

答案 2 :(得分:5)

其他答案已经很好地提出了解决问题的替代解决方案,因此我将查看您提出的更大问题,并引导您了解更聪明的开发人员{{3} }。


当我看到eval时,一片乌云落在周围的代码上,我怀疑和不信任地看着整个混乱,直到我对它的使用是否合理感到满意为止。

[...]

eval是一个坏主意,因为几乎每次我看到它都会被使用,它会导致无法预料和不必要的问题。

重要的部分是“不可预见的”和“不必要的”。不可预见的是因为eval有一个巨大堆与它相关的警告,一个我甚至无法想到的完整回忆的列表。不必要,因为eval的替代方案往往不需要更多的工作来实施,而eval引起的问题是微妙和邪恶的。

[...]

eval很糟糕,因为它引入了许多微妙的安全性和转换问题,它会破坏字节码缓存,它会隐藏语法和其他错误直到运行时,它会导致操作难以理解的距离,它会破坏语法高亮。它只会使您的代码更糟。


您说您确定不要将eval()公开给用户输入。大!这是一个很好的第一步 - 但正如引用提到的那样,你不必考虑使用eval()的事情列表。是什么让这个答案以及你所聚集的其他人得到的结论是eval()是一个虚假的经济。至少是技术债务的产生。与优化一样,两个答案是“我应该使用eval()吗?”是“你不应该”和“你不应该尚未。”

答案 3 :(得分:-1)

通常有更好的方式来编写它。在这种情况下,它是locals(),尽管您可能希望首先有一个复选框对象列表而不是它们的名称和多个变量:

config = wx.Config()
checkBoxes = ['option_1', 'option_2']
for key in checkBoxes:
    config.Write(key, str(locals()['m_checkBox_' + key].Value()))

答案 4 :(得分:-1)

config.Write(key, str(locals()['m_checkBox_%s' % key].Value()))

使用locals()表示本地人,globals()表示全局,getattr(obj, attr_name)表示通过attr_name获取obj的attr。