Шаблон для сопоставления результатов разбора со связанным списком узлов - PullRequest
4 голосов
/ 12 апреля 2011

Я определил 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

SYNTAX TREE:

['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 до завершения тестов ... в случае, если мы обнаружим проблемы и добавим больше наблюдений в ходе проведения теста.Моя теория состоит в том, что положение каждого элемента в списке достаточно, но я готов изменить это, если это часть проблемы.

Проблема в том, что я заблудился, пытаясь назначить Key-Значения для объектов в связанном списке после его построения.Например, после того, как я вставил Observation namedtuple в первый Iteration, у меня возникли проблемы с надежной обработкой обновления assign Observation results_bool = True в приведенном выше примере.

Существует ли обобщенный шаблон проектирования для обработкиэта ситуация?Я уже некоторое время гуглял, но, похоже, не могу установить связь между разбором текста (что я могу сделать) и управлением иерархией данных (основная проблема).Гиперссылки или небольшой демонстрационный код - это хорошо ... Мне просто нужны указатели, чтобы встать на правильный путь.

Ответы [ 2 ]

1 голос
/ 28 апреля 2011

Я завелся с помощью textfsm , что позволяет мне сохранять состояние между различными строками при анализе файла конфигурации.

1 голос
/ 12 апреля 2011

Я не знаю фактического шаблона проектирования того, что вы ищете, но у меня есть большая страсть к этой проблеме.Я интенсивно работаю с сетевыми устройствами, и анализ и организация данных являются для меня большой постоянной проблемой.

Ясно, что проблема заключается не в анализе данных, а в том, что вы делаете с ними впоследствии.Здесь вам нужно подумать о том значении, которое вы вкладываете в проанализированные данные.Метод nested-list может хорошо работать, если объекты, содержащие списки, также имеют смысл.

Именованные кортежи отлично подходят для быстрого и грязного поведения класса, но они не работают, когда они вам нужны.что-либо вне базового доступа к атрибутам, особенно учитывая, что в качестве кортежей они являются неизменяемыми.Мне кажется, что вы захотите заменить некоторые namedtuple объекты полноценными классами.Таким образом, вы можете настроить поведение и доступные методы.

Например, вы знаете, что Iteration всегда будет содержать 1 или более Observation объектов, которые затем будут содержать 1 или более DataPoint объектов.Если вы можете точно описать отношения, это поможет вам разобраться с ними.

...