Понимание команд библиотеки Python netaddr

Я пытаюсь понять, как работает некоторый код из руководств по Python netaddr на https://pythonhosted.org/netaddr/tutorial_01.html. В частности, следующий учебник.

Сводный список адресов и подсетей

Еще одной полезной операцией является возможность суммировать группы IP-подсетей и адресов, объединяя их, где это возможно, для создания наименьшего возможного списка подсетей CIDR.

Вы делаете это в netaddr, используя функцию cidr_merge().

Сначала мы создаем список IP-объектов, который содержит хорошее сочетание отдельных адресов и подсетей, а также некоторые строковые значения IP-адресов для хорошей оценки. Чтобы сделать вещи более интересными, также добавлены некоторые адреса IPv6.

>>> ip_list = [ip for ip in IPNetwork('fe80::/120')]
>>> ip_list.append(IPNetwork('192.0.2.0/24'))
>>> ip_list.extend([str(ip) for ip in IPNetwork('192.0.3.0/24')])
>>> ip_list.append(IPNetwork('192.0.4.0/25'))
>>> ip_list.append(IPNetwork('192.0.4.128/25'))
>>> len(ip_list)
515
>>> cidr_merge(ip_list)
[IPNetwork('192.0.2.0/23'), IPNetwork('192.0.4.0/24'), IPNetwork('fe80::/120')]

Я немного смущен различными доступными вариантами. В чем разница между ip_list.extend([str(ip) for ip in IPNetwork('192.0.3.0/24')]) и ip_list.append(IPNetwork('192.0.4.0/25')).

Если я не хочу начинать список с IPv6 (fe80::/120) и вместо этого хочу использовать IPv4 (192.0.4.0/24), каким будет синтаксис. Будет ли это так же просто, как следующее?

ip_list = IPNetwork('192.0.4.0/25')

Спасибо.


person algorhythm    schedule 23.04.2015    source источник


Ответы (2)


Этот код пытается продемонстрировать, что функция cidr_merge() может объединить список объектов netaddr.IPAddress, строк IP-адресов и объектов netaddr.IPNetwork в минимальную группу IP-адресов и подсетей. Для этого создается список Python, содержащий различные объекты, связанные с IP-адресами. Затем этот список передается в cidr_merge(), чтобы показать, что объекты IP-адреса были объединены в минимальный набор объектов.

Первоначально он создает список Python, ip_list содержащий ряд отдельных netaddr.IPAddress объектов. К этому списку он добавляет объект подсети IPNetwork. Обратите внимание, что это стандартная операция списка Python — list.append() просто добавляет свой аргумент в конец списка, например:

>>> l = [1, 2]
>>> l.append(3)
>>> print l
[1, 2, 3]

list.extend() расширяет данный список элементами из другого списка (ну, фактически любого итерируемого), например.

>>> l.extend([4, 5, 6])
>>> print l
[1, 2, 3, 4, 5, 6]

Дополнительные сведения об этих операциях со списками см. в документации Python. .

Так что да, это так же просто, как:

>>> ip_list = [IPNetwork('192.0.4.0/25')]    # create a list containing IPNetwork object
>>> print ip_list
[IPNetwork('192.0.4.0/25')]

и добавление/расширение списка по мере необходимости.

person mhawke    schedule 23.04.2015
comment
Спасибо за хорошее объяснение. Скажите, есть ли разница между ip_list.extend([str(ip) for ip in IPNetwork('192.0.3.0/24')]) и ip_list.append(IPNetwork('192.0.3.0/24'))? - person algorhythm; 23.04.2015
comment
@CMac: Почему бы вам не взглянуть на списки после выполнения каждой операции над пустым списком? Это ясно покажет, что есть разница в ip_list. Однако результат после запуска cidr_merge() должен быть одинаковым, т. е. оба списка должны давать [IPNetwork('192.0.3.0/24')]. - person mhawke; 23.04.2015

О разнице между Apend и Extend см.:

https://stackoverflow.com/a/252711/1172412

Вы должны быть в состоянии начать список так.

person Steven    schedule 23.04.2015