Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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文件包装器,最佳设计?_Python_File_Inheritance_Io_Wrapper - Fatal编程技术网

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)