我知道应该避免使用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()'))
Run Code Online (Sandbox Code Playgroud)
没有任何安全问题,因为没有任何用户输入到eval,对我来说似乎很清楚.有一个更好的方法吗?
怎么样:
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()))
Run Code Online (Sandbox Code Playgroud)
config = wx.Config()
checkBoxes = ['option_1', 'option_2']
for key in checkBoxes:
config.Write(key, str(getattr(self, 'm_checkBox_'+key).Value()))
Run Code Online (Sandbox Code Playgroud)
其他答案已经很好地提出了解决问题的替代解决方案,因此我将查看您提出的更大问题,并引导您了解一个更聪明的开发人员的话,他们详细描述了eval的问题.
当我看到eval,一片乌云落在周围的代码上,我怀疑和不信任地看着整个混乱,直到我对它的使用是合理的感到满意为止.
[...]
eval这是一个坏主意,因为几乎每次我看到它都使用它,它已经造成了无法预料和不必要的问题.
重要的是"不可预见的"和"不必要的".不可预见的因为eval有一大堆与它相关的警告,一个我甚至无法想到的完整回忆的清单.不必要的,因为替代方案eval往往不需要更多的工作来实施,而引起的问题eval是微妙和邪恶的.
[...]
eval这很糟糕,因为它引入了许多微妙的安全性和翻译问题,它会破坏字节码缓存,它会隐藏语法和其他错误,直到运行时,它会导致操作在一个难以遵循的距离,它会破坏语法突出显示.它只会让你的代码变得更糟.
你说你确定不要暴露eval()给用户输入.大!这是一个很好的第一步 - 但正如引用提到的那样,这根本不是你需要考虑的事情清单的最后一步eval().是什么带来了这个答案以及你们聚在一起的其他人eval()是错误的经济.它至少是技术债务的产生.像优化一样,两个答案是"我应该使用eval()吗?" 是"你不应该"和"你不应该还没有."