Python文件包装器,最佳设计?
我需要解析特定于域的配置文件,但在我开始从中提取黄金之前,我想删除注释 删除注释后,我仍然希望能够使用诸如Python文件包装器,最佳设计?,python,file,inheritance,io,wrapper,Python,File,Inheritance,Io,Wrapper,我需要解析特定于域的配置文件,但在我开始从中提取黄金之前,我想删除注释 删除注释后,我仍然希望能够使用诸如getline()、seek()和tell() (由于删除了大数据块,搜索中的偏移量很好,因为所有解析都封装在单个解析对象中) 从文件继承?: 我的第一个想法是创建一个像MyFile(file)这样的对象,并重写\uuuu init\uuuu来创建一个self.content字符串,然后用文件访问重写所有内容。。。但这看起来太棘手了(我看到许多论坛帖子上的人在尝试这一点时遇到了困难) 委托给
getline()
、seek()
和tell()
(由于删除了大数据块,搜索中的偏移量很好,因为所有解析都封装在单个解析对象中)
从文件继承?:
我的第一个想法是创建一个像MyFile(file)
这样的对象,并重写\uuuu init\uuuu
来创建一个self.content
字符串,然后用文件访问重写所有内容。。。但这看起来太棘手了(我看到许多论坛帖子上的人在尝试这一点时遇到了困难)
委托给文件对象:
创建一个MyFile(file)
类,该类创建一个file
类,并将调用从MyFile
实例委托给内部file
实例。
如果对MyFile
的调用预期返回的值超出了注释find/replace搜索参数,则这是有意义的。。。
例如:getline()
可以用于单行注释,但对于前3行构成单个块注释的文件,getline()
getline()
如果没有大量混乱的代码,就无法工作
(更不用说跟踪seek()
offset)
在临时文件中重新创建?:
最后,我觉得我在解析整个文件时采用了惰性选项,然后将其重新保存为临时文件。。。然后返回一个文件句柄(下面的演示代码)
更好的设计?:
有人有更好的设计吗?。。。
或者甚至从完全不同的角度来看待这类问题。老实说,听起来您的DSL解析器可能就是问题所在。基本上,如果你设计了一个DSL,它应该包括对评论的识别,而忽略它们 将其作为文件过滤器编写是一个有趣但复杂的过程——它只是为了掩盖DSL解析器不完整的事实 根据您编写解析器的方式,这可能很容易,也可能不太容易修复。但是,以verilog解析器为例。它只是有cStyleComment的定义,并告诉解析器完全忽略它们。没有混乱,没有大惊小怪
谢谢合成器帕特尔!,你是完全正确的,我一直在错误的层面上看待它。。。我(PS:我没有设计DSL,我只是在解析它……如果它是我的,它应该是XML格式的,但这不会改变你的观察结果。)。。。我现在已经完成了这方面的工作,我还需要继续其他任务,但我肯定会花一些时间了解
pyparsing
。。。谢谢;)Pyparsing不再托管在wikispaces.com上。去
import re
import tempfile
FILE_NAME = 'some_file.ldf'
# ideal case
fh = open(FILE_NAME)
# my example
def getHandle(self, filename, mode='r'):
# ----- Remove comments -----
with open(filename, mode=mode) as fh:
content = fh.read()
# remove /* ... */ comment blocks
content = re.sub(re.compile(r'/\*.*?\*/', re.DOTALL | re.MULTILINE), '', content, re.DOTALL | re.MULTILINE)
# remove // ... line comments
content = re.sub(r'//.*', '', content)
# ----- Write to Temporary File -----
fh = tempfile.TemporaryFile()
fh.write(content)
fh.seek(0)
fh = getHandle(FILE_NAME)