我已经定义了一个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
语法树:
^{pr2}$我试图将上面语法树中所有嵌套的键值对关联到一个对象的链接列表中。。。继承结构看起来像这样(每个单词都是一个namedtuple
。。。继承人的子女在父母的子女名单上):
Log: [
Iteration: [
Observation:
[DataPoint, DataPoint],
Observation:
[DataPoint, DataPoint]
]
]
所有这一切的目标是建立一个通用的测试数据采集平台来驱动针对networkgear的测试流,并记录结果。当数据采用这种格式后,将使用相同的数据结构来构建测试报告。为了回答下面评论中的问题,我选择了一个链接列表,因为这似乎是编写报告时按顺序排列信息的最简单方法。然而,我宁愿在完成测试之前不指定Iteration
或{
问题是,在链接列表建立后,我试图为链接列表中的对象分配键值,这让我迷路了。例如,在我将一个Observation
namedtuple
插入第一个Iteration
之后,在上面的示例中,我很难可靠地处理assign Observation results_bool = True
的更新。在
有没有一种通用的设计模式来处理这种情况?我已经在google上搜索了一段时间,但是我似乎无法在解析文本(我可以做到)和管理数据层次结构(主要问题)之间建立联系。超链接或小的演示代码是好的。。。我只需要指点才能进入正确的轨道。在
最后我使用了textfsm,这允许我在分析配置文件时保持不同行之间的状态。在
我不知道你要找的是什么样的实际设计模式,但我对手头的问题有着极大的热情。我大量使用网络设备,解析和组织数据对我来说是一个巨大的挑战。在
很明显,问题不在于解析数据,而在于之后如何处理数据。在这里,您需要考虑附加到已解析数据的含义。如果包含列表的对象也有意义,则嵌套列表方法可能会很适合您。在
Namedtuples对于快速和脏类的行为非常有用,但是当您需要它们执行基本属性访问之外的任何操作时,它们就不会出现问题,特别是考虑到作为元组,它们是不可变的。在我看来,您可能希望用完整的类替换某些
namedtuple
对象。通过这种方式,您可以高度定制可用的行为和方法。在例如,您知道
Iteration
将始终包含1个或多个Observation
对象,这些对象将包含1个或多个DataPoint
对象。如果你能准确地描述这些关系,这将使你走上处理它们的道路。在相关问题 更多 >
编程相关推荐