我已经定义了一个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]
]
]
所有这一切的目标是构建一个通用的测试数据采集平台,以驱动针对网络设备的测试流程,并记录结果。数据采用这种格式后,将使用相同的数据结构来构建测试报告。为了回答下面评论中的问题,我选择了一个链表,因为它似乎是在编写报告时顺序出列信息的最简单方法。但是,我宁愿在完成测试之前不分配Iteration
或Observation
序列号……以防我们在进行测试的过程中发现问题并插入更多的观察。我的理论是列表中每个元素的位置就足够了,但如果它是问题的一部分,我愿意改变它。
问题是我在构建链接列表后尝试将键值分配给链接列表中的对象时迷失了方向。例如,在我将 anObservation
namedtuple
插入到 first之后Iteration
,我无法可靠地处理assign Observation results_bool = True
上面示例中的更新。
是否有通用的设计模式来处理这种情况?我已经用谷歌搜索了一段时间,但我似乎无法在解析文本(我可以做到)和管理数据层次结构(主要问题)之间建立联系。超链接或小型演示代码都很好......我只需要指针就可以走上正确的轨道。