2

我知道应该避免使用 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 没有任何用户输入,这对我来说似乎很清楚。有一个更好的方法吗?

4

5 回答 5

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()))
于 2012-08-01T21:53:54.317 回答
5
config = wx.Config()
checkBoxes = ['option_1', 'option_2']
for key in checkBoxes:
    config.Write(key, str(getattr(self, 'm_checkBox_'+key).Value()))
于 2012-08-01T22:03:33.350 回答
5

其他答案在为手头的问题提出替代解决方案方面做得很好,所以我将看看你提出的更大的问题,并将你引向一个更聪明的开发人员的话,他详细地写了 eval 的问题


当我看到eval时,一片乌云笼罩着周围的代码,我以怀疑和不信任的眼光注视着整个混乱,直到我确信它的使用是合理的。

[...]

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

重要的部分是“不可预见的”和“不必要的”。不可预见,因为eval一大堆与之相关的警告,我什至不经过深思熟虑就无法完整回忆起这份清单。不必要的,因为替代方案eval往往不需要更多的工作来实施,而由此引起的问题eval是微妙和邪恶的。

[...]

eval不好,因为它引入了许多微妙的安全和翻译问题,它破坏了字节码缓存,它隐藏了语法和其他错误直到运行时,它导致了难以遵循的距离,它破坏了语法突出显示。它只会让你的代码变得更糟。


你说你确保不暴露eval()给用户输入。伟大的!这是一个很好的第一步 - 但正如引用所提到的,这根本不是你必须考虑的事情列表的结尾eval()。带来这个答案和你得到的其他答案eval()是一种虚假的经济。至少,这是技术债务的产生。像优化一样,“我应该使用eval()?”的两个答案。是“你不应该”和“你还不应该”。

于 2012-08-01T22:04:56.180 回答
-1

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

config = wx.Config()
checkBoxes = ['option_1', 'option_2']
for key in checkBoxes:
    config.Write(key, str(locals()['m_checkBox_' + key].Value()))
于 2012-08-01T21:53:31.550 回答
-1
config.Write(key, str(locals()['m_checkBox_%s' % key].Value()))

用于局部变量locals()globals()用于全局变量,getattr(obj, attr_name)用于通过 attr_name 获取 obj 的属性。

于 2012-08-01T21:56:23.380 回答