我已经定义了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
.. heirarchy的孩子在父母的孩子名单上:)
Log: [
Iteration: [
Observation:
[DataPoint, DataPoint],
Observation:
[DataPoint, DataPoint]
]
]
所有这一切的目标是建立一个通用的测试数据采集平台,以推动针对网络设备的测试流程,并记录结果。在数据采用此格式后,将使用相同的数据结构来构建测试报告。为了回答下面评论中的问题,我选择了一个链表,因为它似乎是在编写报告时顺序出列信息的最简单方法。但是,在完成测试之前,我宁愿不分配Iteration
或Observation
序列号...如果我们发现问题并在进行测试过程中插入更多观察。我的理论是列表中每个元素的位置是足够的,但如果它是问题的一部分,我愿意改变它。
问题是我在构建之后试图将链值分配给链表中的对象时迷路了。例如,在我向第一个Observation
插入namedtuple
Iteration
后,我无法在上面的示例中可靠地处理assign Observation results_bool = True
的更新。
是否有处理这种情况的通用设计模式?我已经谷歌搜索了一段时间,但我似乎无法在解析文本(我可以做)和管理数据-heirarchy(主要问题)之间建立联系。超链接或小型演示代码很好......我只需要指点即可走上正轨。
答案 0 :(得分:1)
我不知道你正在寻找的实际设计模式,但我对手头的问题非常热情。我在网络设备上工作很多,解析和组织数据对我来说是一个巨大的持续挑战。
很明显,问题不是解析数据,而是你之后用它做什么。在这里,您需要考虑要附加到已解析数据的含义。如果包含列表的对象也有意义,嵌套列表方法可能适合您。
Namedtuples非常适合快速和肮脏的类行为,但是当你需要它们在基本属性访问之外做任何事情时,它们会变得平淡,特别是考虑到它们是不可变的元组。在我看来,你会想要用完整的类替换某些namedtuple
对象。这样,您可以高度自定义可用的行为和方法。
例如,您知道Iteration
将始终包含一个或多个Observation
个对象,这些对象将包含一个或多个DataPoint
个对象。如果您能够准确地描述这些关系,那么就会为您设置处理它们的路径。
答案 1 :(得分:1)
我使用textfsm结束了,它允许我在解析配置文件时保持不同行之间的状态。