Иногда, при переборе объектов в цикле for, нужно не только получить сам объект, но и его порядковый номер. Это можно сделать, создав дополнительную переменную, которая будет расти на единицу с каждым прохождением цикла. Однако, гораздо удобнее это делать с помощью итератора enumerate()
.
Базовый пример:
In [15]: list1 = ['str1', 'str2', 'str3'] In [16]: for position, string in enumerate(list1): ...: print(position, string) ...: 0 str1 1 str2 2 str3
enumerate()
умеет считать не только с нуля, но и с любого значение, которое ему указали после объекта:
In [17]: list1 = ['str1', 'str2', 'str3'] In [18]: for position, string in enumerate(list1, 100): ...: print(position, string) ...: 100 str1 101 str2 102 str3
Иногда нужно проверить, что сгенерировал итератор, как правило, на стадии написания скрипта. Если необходимо увидеть содержимое, которое сгенерирует итератор, полностью, можно воспользоваться функцией list:
In [19]: list1 = ['str1', 'str2', 'str3'] In [20]: list(enumerate(list1, 100)) Out[20]: [(100, 'str1'), (101, 'str2'), (102, 'str3')]
В этом примере используется Cisco . Если в двух словах, то EEM позволяет выполнять какие-то действия (action) в ответ на событие (event).
Выглядит applet EEM так:
event manager applet Fa0/1_no_shut event syslog pattern "Line protocol on Interface FastEthernet0/0, changed state to down" action 1 cli command "enable" action 2 cli command "conf t" action 3 cli command "interface fa0/1" action 4 cli command "no sh"
В EEM, в ситуации, когда действий выполнить нужно много, неудобно каждый раз набирать action x cli command
. Плюс, чаще всего, уже есть готовый кусок конфигурации, который должен выполнить EEM.
С помощью простого скрипта Python можно сгенерировать команды EEM на основании существующего списка команд (файл enumerate_eem.py):
import sys config = sys.argv[1] with open(config, 'r') as f: for i, command in enumerate(f, 1): print('action {:04} cli command "{}"'.format(i, command.rstrip()))
В данном примере команды считываются из файла, а затем к каждой строке добавляется приставка, которая нужна для EEM.
Файл с командами выглядит так (r1_config.txt):
en conf t no int Gi0/0/0.300 no int Gi0/0/0.301 no int Gi0/0/0.302 int range gi0/0/0-2 channel-group 1 mode active interface Port-channel1.300 encapsulation dot1Q 300 vrf forwarding Management ip address 10.16.19.35 255.255.255.248
Вывод будет таким:
$ python enumerate_eem.py r1_config.txt action 0001 cli command "en" action 0002 cli command "conf t" action 0003 cli command "no int Gi0/0/0.300" action 0004 cli command "no int Gi0/0/0.301" action 0005 cli command "no int Gi0/0/0.302" action 0006 cli command "int range gi0/0/0-2" action 0007 cli command " channel-group 1 mode active" action 0008 cli command "interface Port-channel1.300" action 0009 cli command " encapsulation dot1Q 300" action 0010 cli command " vrf forwarding Management" action 0011 cli command " ip address 10.16.19.35 255.255.255.248"