Книга: PyNEng
Назад: Функция sorted
Дальше: Функция zip

Функция enumerate

enumerate

Иногда, при переборе объектов в цикле 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')] 

Пример использования enumerate для EEM

В этом примере используется 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" 
Назад: Функция sorted
Дальше: Функция zip