gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:20:46 27 4
gpt4 key购买 nike

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

选项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:为子类中的每种文件格式实现解析器。然后创建一个对象工厂,根据文件扩展名选择子类:

class FileParser:
@staticmethod
def load_file(file_name):
ext = os.path.splitext(file_name)[1]
if ext == '.foo':
return FooFileParser(file_name)
elif ext == '.bar':
return BarFileParser(file_name)
else:
raise TypeError('Wrong file extension')

def do_great_things_with_data(self):
pass

class FooFileParser(FileParser):
def __init__(self):
pass

class BarFileParser(FileParser):
def __init__(self):
pass

使用哪种方法更好?各有什么优点/缺点?

最佳答案

所以还有第三种选择:在模块级别为每种格式定义解析函数。是否确实需要将它们放入类(class)?

一个小例子:

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")

关于python - Python 中文件解析器的包装或继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53867834/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com