4

我已经定义了一个pyparsing规则来将此文本解析为语法树...

文本命令:

add Iteration name = "Cisco 10M/half"
    append Observation name = "packet loss 1"
        assign Observation results_text = 0.0
        assign Observation results_bool = True
        append DataPoint
            assign DataPoint metric = txpackets
            assign DataPoint units = packets
        append DataPoint
            assign DataPoint metric = txpackets
            assign DataPoint units = packets
    append Observation name = "packet loss 2"
        append DataPoint
            assign DataPoint metric = txpackets
            assign DataPoint units = packets
        append DataPoint
            assign DataPoint metric = txpackets
            assign DataPoint units = packets

语法树:

['add', 'Iteration', ['name', 'Cisco 10M/half']]
['append', 'Observation', ['name', 'packet loss 1']]
['assign', 'Observation', ['results_text', '0.0']]
['assign', 'Observation', ['results_bool', 'True']]
['append', 'DataPoint']
['assign', 'DataPoint', ['metric', 'txpackets']]
['assign', 'DataPoint', ['units', 'packets']]
...

我试图将上面语法树中的所有嵌套键值对关联到对象的链表中......层次结构看起来像这样(每个单词都是一个namedtuple......层次结构中的孩子在父母子女名单):

Log: [ 
    Iteration: [ 
        Observation: 
            [DataPoint, DataPoint], 
        Observation: 
            [DataPoint, DataPoint]
    ]
]

所有这一切的目标是构建一个通用的测试数据采集平台,以驱动针对网络设备的测试流程,并记录结果。数据采用这种格式后,将使用相同的数据结构来构建测试报告。为了回答下面评论中的问题,我选择了一个链表,因为它似乎是在编写报告时顺序出列信息的最简单方法。但是,我宁愿在完成测试之前不分配IterationObservation序列号……以防我们在进行测试的过程中发现问题并插入更多的观察。我的理论是列表中每个元素的位置就足够了,但如果它是问题的一部分,我愿意改变它。

问题是我在构建链接列表后尝试将键值分配给链接列表中的对象时迷失了方向。例如,在我将 anObservation namedtuple插入到 first之后Iteration,我无法可靠地处理assign Observation results_bool = True上面示例中的更新。

是否有通用的设计模式来处理这种情况?我已经用谷歌搜索了一段时间,但我似乎无法在解析文本(我可以做到)和管理数据层次结构(主要问题)之间建立联系。超链接或小型演示代码都很好......我只需要指针就可以走上正确的轨道。

4

2 回答 2

1

我不知道您正在寻找的实际设计模式,但我对手头的问题充满热情。我大量使用网络设备,解析和组织数据对我来说是一个巨大的持续挑战。

很明显,问题不在于解析数据,而在于你之后如何处理它。这是您需要考虑附加到已解析数据的含义的地方。如果包含列表的对象也有意义,则嵌套列表方法可能对您很有效。

命名元组非常适合快速而肮脏的类行为,但是当您需要它们执行基本属性访问之外的任何操作时,它们就会失败,特别是考虑到它们作为元组是不可变的。在我看来,您可能想namedtuple用成熟的类替换某些对象。通过这种方式,您可以高度自定义可用的行为和方法。

例如,您知道 anIteration将始终包含 1 个或多个Observation对象,然后将包含 1 个或多个DataPoint对象。如果你能准确地描述这些关系,这会让你走上处理它们的道路。

于 2011-04-12T01:00:09.437 回答
1

我最终使用了textfsm,它允许我在解析配置文件时保持不同行之间的状态。

于 2011-04-28T11:47:47.613 回答