Python中文件解析器的包装或继承

2024-04-23 07:51:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类,它实现了特定文件格式的解析器。 我想添加对另一种格式的支持。在我看来,这可以通过两种方式实现:

选项1:在同一个类中实现多个解析器方法,检查文件扩展名并调用适当的方法进行处理:

class FileParser:
    def __init__(self, file_name):
        self.ext = os.path.splitext(file_name)[1]
        if self.ext == '.foo':
            self.data = self._parse_foo(file_name)
        elif self.ext == '.bar':
            self.data = self._parse_bar(file_name)
        else:
            raise TypeError('Wrong file extension')

    def _parse_foo(self,file_name):
        pass

    def _parse_bar(self,file_name):
        pass

    def do_great_things_with_data(self):
        pass

选项2:在子类中为每个文件格式实现解析器。然后创建一个对象工厂,根据文件扩展名选择子类:

^{pr2}$

哪种方法更好?各自有哪些优点/缺点?在


Tags: 文件方法nameself解析器datafooparse
2条回答

如果您事先不知道文件类型,那么我建议第一种方法:有一个类根据文件扩展名选择适当的内部方法。在

  • 例如,如果您只有一个API端点,用户可以上载任何类型的文件,但是您只使用一个文件解析器类,该类必须在内部选择要使用的正确解析方法,那么这将非常有用。在

第二种方法只有在您事先知道文件类型但不想重复代码时才有用(在我看来)。在

  • 例如,每个文件类型都有不同的API端点;每个端点将使用自己的文件解析器子类,并且只覆盖特定于该文件扩展名的部分。在

所以还有第三种选择:在模块级别为每种格式定义解析函数。有没有必要把他们放在一个班里?在

一个小例子:

def parse_foo(f):
    pass

def parse_bar(f):
    pass

PARSERS = {
    ".foo": parse_foo,
    ".bar": parse_bar,
}

def load_file(parsers, name):
    try:
        parse = parsers[os.path.splitext(name)[-1]]
    except KeyError as e:
        raise RuntimeError("no parser for {}".format(e))
    with open(name) as f:
        return parse(f)

load_file(PARSERS, "myfile.foo")

相关问题 更多 >