Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用exec()执行从文本文件读取的代码是否是错误的做法?_Python_Exec - Fatal编程技术网

Python 使用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.

我试图从一个文本文件中读取数据,其中列出了一个变量名并给它一个值

e、 g

我想将这些数据存储到已经初始化的类变量中。类变量的名称与文本文件中的变量相同。在这种情况下使用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)

是的。使用
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)