1

我编写了一个类,让我可以传入变量类型、变量名、提示和默认值的列表。该类创建了一个 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 调用来显示、编辑(以及将所有变量保存到文件中)或再次阅读它们)?

生硬

4

4 回答 4

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())
于 2009-07-17T17:40:40.333 回答
1

我同意 mipadi 的回答,但想再添加一个答案,因为原始帖子询问使用 exec 是否有问题。我想解决这个问题。

像罪犯一样思考。

如果您的恶意对手知道您的代码如下:

exec('self.' + var_name + '=' + var_text_ctrl.GetValue() )

然后他或她可能会尝试为 var_name 和 var_text_ctrl 注入值来破解您的代码。

想象一下,如果恶意用户可以让 var_name 成为这个值:

var_name = """
a = 1 # 一些虚假的任务来完成“自我”。陈述
import os # 恶意代码从这里开始
os.rmdir('/bin') # 做一些坏事
                      # 以另一个 var_name 结束
                      # ("a" 单独,在下一行)
一个     
"""

突然之间,恶意对手能够让您执行 [ute] 代码以删除您的 /bin 目录(或他们想要的任何邪恶)。现在您的 exec 语句大致相当于:

exec ("self.a=1 \n 导入操作系统 \n os.rmdir('/bin') \n\n "
             "a" + ' = ' + var_text_ctrl.GetValue() )

不好!!!

可以想象,当使用 exec 时,可以构造各种恶意代码注入。这给开发人员带来了考虑任何可以破解代码的方式的负担 - 并且在有无风险替代方案可用时增加了不必要的风险。

于 2009-07-20T20:17:39.553 回答
0

对于安全意识,可能有一个可接受的替代方案。曾经有一个模块调用 rexec 允许“受限”执行任意 python 代码。该模块已从最近的 python 版本中删除。http://pypi.python.org/pypi/RestrictedPython是 Zope 人的另一个实现,它为任意 python 代码创建了一个“受限”环境。

于 2009-07-28T01:01:47.403 回答
0

该模块已被删除,因为它存在安全问题。很难提供一个可以在受限环境中执行任何代码的环境,并且具有 Python 所具有的所有自省功能。

更好的选择是避免 eval 和 exec。

一个非常不寻常的想法是使用 Google App Engine,让他们担心恶意代码。

于 2009-07-28T20:21:24.877 回答