我编写了一个类,它允许我传递变量类型,变量名称,提示和默认值的列表。该类创建一个wxPython面板,该面板显示在一个框架中,该框架允许用户在按下计算按钮并将结果作为绘图返回之前设置输入值。我使用exec语句将所有变量添加到类中。这将所有变量保存在一个类中,我可以按名称引用它们。
light = Variables( frame , [ ['f','wavelength','Wavelength (nm)',632.8] ,\
['f','n','Index of Refraction',1.0],])
在课程内部,我使用以下语句创建和设置变量:
for variable in self.variable_list:
var_type,var_text_ctrl,var_name = variable
if var_type == 'f' :
exec( 'self.' + var_name + ' = ' + var_text_ctrl.GetValue() )
当我需要使用变量时,我可以按名称引用它们:
wl = light.wavelength
n = light.n
然后我读到SO,很少需要在Python中使用exec。这种方法有问题吗?有没有更好的方法来创建一个类,该类包含应该组合在一起的变量,您希望能够编辑,还有用于显示,编辑的代码和wxPython调用(并且还将所有变量保存到文件中)或者再次阅读它们?)
简略
答案 0 :(得分:18)
您可以使用setattr
函数,该函数有三个参数:对象,属性名称及其值。例如,
setattr(self, 'wavelength', wavelength_val)
相当于:
self.wavelength = wavelength_val
所以你可以这样做:
for variable in self.variable_list:
var_type,var_text_ctrl,var_name = variable
if var_type == 'f' :
setattr(self, var_name, var_text_ctrl.GetValue())
答案 1 :(得分:1)
我同意mipadi的回答,但是想补充一个答案,因为Original Post询问使用exec是否有问题。我想解决这个问题。
像罪犯一样思考。
如果你的恶意攻击者知道你的代码是:
exec( 'self.' + var_name + ' = ' + var_text_ctrl.GetValue() )
然后他或她可能会尝试为var_name和var_text_ctrl注入破坏代码的值。
想象一下,如果恶意用户可以将var_name作为此值:
var_name = """ a = 1 # some bogus assignment to complete "self." statement import os # malicious code starts here os.rmdir('/bin') # do some evil # end it with another var_name # ("a" alone, on the next line) a """
突然之间,恶意攻击者能够让你执行[ute]代码来删除你的/ bin目录(或者他们想要的任何邪恶)。现在你的exec语句粗略地读取了相应的:
exec ("self.a=1 \n import os \n os.rmdir('/bin') \n\n " "a" + ' = ' + var_text_ctrl.GetValue() )
不好!!!
可以想象,当使用exec时,可以构建各种恶意代码注入。这会给开发人员带来负担,让他们想到代码可能被黑客攻击的任何方式 - 并且当有无风险的替代方案可用时,会增加不必要的风险。
答案 2 :(得分:0)
为了安全意识,可能有一个可接受的选择。曾经有一个模块调用rexec,允许“限制”执行任意python代码。该模块已从最近的python版本中删除。 http://pypi.python.org/pypi/RestrictedPython是Zope人员的另一个实现,它为任意python代码创建了一个“受限制”的环境。
答案 3 :(得分:0)
该模块已被删除,因为它存在安全问题。很难提供一个环境,任何代码都可以在受限制的环境中执行,并具有Python所具有的所有内省。
更好的选择是避免使用eval和exec。
一个非常不可思议的想法是使用Google App Engine,让他们担心恶意代码。