面向对象,Python:如何(在架构上正确地)实现不同的文本文件解析器?

2024-05-23 23:42:24 发布

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

大家好。我正在构建一个RESTful API,它返回一些文本文件(.pdd)的内容。这些文件的组织如下:

|-- 10200                          # some patient's id
|   |-- Cardio
|   |   |-- 3002                    # some event id
|   |   |   |-- some_data.pdd
|   |-- Encounter
|   |   |-- 5222                    # some event id
|   |   |   |-- CPS.pdd
|   |   |   |-- S_ASSESSMENT.pdd
|   |   |   |-- S_CCHPI.pdd
|   |   |   |-- S_PLAN.pdd
|   |   |   |-- S_ROS.pdd
|   |   |   |-- S_VITALS.pdd
|   |   |-- 5223
|   |   |   |-- CPS.pdd
|   |   |   |-- S_ASSESSMENT.pdd
|   |   |   |-- S_PLAN.pdd
|   |   |   |-- S_VITALS.pdd
|   |   |-- 5224

我需要做的(并且已经做过)是基于患者和/或事件id解析.pdd文件(它只是文本)。 为此,我实现了“所有可定制”(正如我所想)类。它工作得很好:

class PddParser:
    def __init__(self, pdd_type,
                 pdd_name=None, pat_code=None, event_id=None)

其中pdd_type是conference/Cardio/etc,pdd_name是可选的、特定的.pdd文件名

工作流是(每个步骤在类的方法中拆分):

1)使用glob(允许使用通配符:用于all或specific.pdd(和/或)patient(和/或)event)获取基于参数的文件路径

2)读取每个文件内容

3)将所有内容聚合到dict中(外部dict的键只是文件名,值是文件内容,内部恰好是dict,因为.pdd将键值作为内容)并返回

这被称为:

parser = PddParser(pdd_type, pdd_name, pat_code, id)
data = pdd_parser.get_pdd_contents() # method from third step
# return data to endpoint

并允许大量不同的端点返回所有/特定患者和/或就诊的所有/特定.pdd

但是有些文件有特定的字段,需要特定的聚合(第三种方法)。按照我实现它的方式,我看不到使用分解(或继承)更改聚合的便捷方式,而只是在方法内部编写更多的代码(可能只是将其拆分为更多的方法,但仍然在一个PddParser中)。原因是我在一个地方为所有端点实例化了类吗?如果是这样的话,我不知道如何重做代码以方便添加特殊情况

最初,我想为每种需要的文件类型(比如,创建PddParser等等)创建子类PddParser,但我不知道在这种情况下如何实现,也不确定它是否正确。 从架构师的角度来看,仅仅在一个基类PddParser内创建更多的方法是否足够好,或者我应该如何处理这个问题以使其正确


Tags: 文件方法namenoneeventid内容data