Кажется, мой дикт перезаписывает, а не обновляет новые строки?

1

Учитывая следующий код:

https://bpaste.net/show/dd44a1fa01dc

from ciscoconfparse import CiscoConfParse
from pprint import pprint
parse = CiscoConfParse("testconfig.txt", syntax="junos")

interfaces = {}
intfs = parse.find_objects_w_parents(r'^interface', r'^\s+ge-')
for intfobj in intfs:
    intf_name = intfobj.text.strip()
    interfaces.update({'name': intf_name})
    descr = intfobj.re_match_iter_typed(r'description\s+"(\S.+?)"$', group=1)
    interfaces.update({'description': descr})
    mode = intfobj.re_match_iter_typed(r'port-mode\s+(\S+)\s*$', group=1,
        all_children=True)
    interfaces.update({'mode': mode})


print (interfaces)

Используя следующие тестовые данные:

https://bpaste.net/show/df422a96aaae

interfaces {
    ge-2/0/0 {
        description "site1;;hostname1;ge-16/0/9;;;TRUST;";
        unit 0 {
            family ethernet-switching {
                port-mode trunk;
            }
        }
    }
    ge-2/0/2 {
        description "site2;;hostname2;ge-16/0/8;;;TRUST;";
        unit 0 {
            family ethernet-switching {
                port-mode trunk;
            }
        }
    }

    vstp {
        bpdu-block-on-edge;
        vlan VLAN_0005 {
            interface ge-2/0/0 {
                edge;
            }
        }
        vlan VLAN_0015 {
            interface ge-2/0/0 {
                edge;
            }
            interface ge-2/0/2 {
                edge;                   
            }
        }  
    }
}

Я пытаюсь понять, почему мои интерфейсы = {} содержит только одну строку:

{'name': 'ge-2/0/2', 'description': 'site2;;hostname2;ge-16/0/8;;;TRUST;', 'mode': 'trunk'}

Я ожидаю, что он будет содержать оба интерфейса из тестовых данных:

{'name': 'ge-2/0/0', 'description': 'site1;;hostname1;ge-16/0/9;;;TRUST;', 'mode': 'trunk'}
{'name': 'ge-2/0/2', 'description': 'site2;;hostname2;ge-16/0/8;;;TRUST;', 'mode': 'trunk'}
  • 2
    interfaces это диктат. Он не может содержать несколько «строк». Вам нужен список диктовок или аналогичных.
  • 1
    dict - это отображения, а не последовательности. Каждый ключ связан (или сопоставлен) с одним значением. Однако это «одиночное» значение может быть list или другим вложенным контейнером.
Показать ещё 1 комментарий
Теги:
ciscoconfparse

2 ответа

1
Лучший ответ

Вы создаете dict и обновляете его значения. Таким образом, вы получаете диктовку с последними значениями. Вы могли бы использовать список dicts, как таковой:

from ciscoconfparse import CiscoConfParse
from pprint import pprint
parse = CiscoConfParse("testconfig.txt", syntax="junos")

interfaces = []
intfs = parse.find_objects_w_parents(r'^interface', r'^\s+ge-')
for intfobj in intfs:
    interface = {}
    interface['name'] = intfobj.text.strip()
    interface['description'] = intfobj.re_match_iter_typed(r'description\s+"(\S.+?)"$', group=1)
    interface['mode'] = intfobj.re_match_iter_typed(r'port-mode\s+(\S+)\s*$', group=1,
        all_children=True)
    interfaces.append(interface)

print (interfaces)
0

Можно попробовать что-то вроде этого

allInterfaces = {}
interfaces = {}
intfs = parse.find_objects_w_parents(r'^interface', r'^\s+ge-')
for intfobj in intfs:
    intf_name = intfobj.text.strip()
    interfaces.update({'name': intf_name})
    descr = intfobj.re_match_iter_typed(r'description\s+"(\S.+?)"$', group=1)
    interfaces.update({'description': descr})
    mode = intfobj.re_match_iter_typed(r'port-mode\s+(\S+)\s*$', group=1,
        all_children=True)
    interfaces.update({'mode': mode})
    allInterfaces = allInterfaces + [interfaces,]

print (allInterfaces)

  • 0
    Упс ... не достаточно быстро :-)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню