Python 使用exec()执行从文本文件读取的代码是否是错误的做法?
我试图从一个文本文件中读取数据,其中列出了一个变量名并给它一个值 e、 g 我想将这些数据存储到已经初始化的类变量中。类变量的名称与文本文件中的变量相同。在这种情况下使用exec()是否是一种不好的做法,是否有更好的方法 下面是我目前拥有的代码。文本文件很长Python 使用exec()执行从文本文件读取的代码是否是错误的做法?,python,exec,Python,Exec,我试图从一个文本文件中读取数据,其中列出了一个变量名并给它一个值 e、 g 我想将这些数据存储到已经初始化的类变量中。类变量的名称与文本文件中的变量相同。在这种情况下使用exec()是否是一种不好的做法,是否有更好的方法 下面是我目前拥有的代码。文本文件很长 def initialize(self): f = open(self.path, "r") for x in range(self.init_var_len): line = f.
def initialize(self):
f = open(self.path, "r")
for x in range(self.init_var_len):
line = f.readline()
if "=" in line:
split_string = line.split("=")
split_string[0] = split_string[0].strip()
split_string[1] = split_string[1].strip()
exec("self." + split_string[0] + "=" + "type(self." + split_string[0] + ")(" + "'"+split_string[1]+"'"+")")
f.close()
for each in self.__dict__.keys():
print eval("self." + each)
是的。使用
exec
是不好的做法。
exec
可以执行任意代码。最重要的问题是,您是否始终隐式信任输入文件?答案应该是,除非您对您个人正在生成的数据使用此代码一次
下面是一个输入文件的示例,您的代码将读取该文件,然后立即删除整个硬盘驱动器
manufacturer_num=12345');导入操作系统;操作系统('rm-rf/
(出于显而易见的原因,我并没有实际测试这一点。)
即使您在自己生成的数据上使用代码,但在将来,您可能会因为为代码编写的格式错误的输入文件而受到伤害
假设您的数据格式保持不变,并且不深入讨论如何使用类变量,下面是我将如何编写代码
def初始化(自):
将open(self.path,“r”)作为f:
对于x,枚举(f)中的行:
line=line.strip()
如果不是直线:
继续#跳过空行
名称,值=[s.strip()表示第行中的s.split(“=”,maxsplit=1)]
如果值中的“=”:
升值误差(
第{x}:{line}行中的f'意外多个“=”)
#初始化取决于self.path。不要让文件
#覆盖它。另外,将我们自己限制为类变量
#因为,希望它们在
#代码,并且OP表示类变量。
cls=类型(自身)
如果不是hasattr(cls,name)或name==“path”:
提升属性错误(名称)
预期类型=类型(getattr(cls,名称))
setattr(自身、名称、预期类型(值))
#vars是访问自我的标准方式__
对于名称,变量中的值(self).items():
打印(名称、值)
使用exec
不是一种好的做法。你已经很难将变量名和值分开,因此最好自己存储它们,例如,在字典中或作为类属性。谢谢你,阅读你将如何做让我意识到一些我忽略的事情。
def initialize(self):
f = open(self.path, "r")
for x in range(self.init_var_len):
line = f.readline()
if "=" in line:
split_string = line.split("=")
split_string[0] = split_string[0].strip()
split_string[1] = split_string[1].strip()
exec("self." + split_string[0] + "=" + "type(self." + split_string[0] + ")(" + "'"+split_string[1]+"'"+")")
f.close()
for each in self.__dict__.keys():
print eval("self." + each)