2015-06-23 1 views
2

Модуль ipaddress содержит функцию IPv4Network, которая может использоваться для определения того, зарезервирован ли адрес IPv4, например.Как лучше всего перебирать список, когда каждый элемент списка будет передан функции?

In [25]: IPv4Address(u'100.64.1.1') in IPv4Network(u'100.64.0.0/10') 
Out[25]: True 

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

def isPrivate(ipaddress): 
    for range in ranges: 
     if ipaddress in IPv4Network(range): 
      print 'private' 

Там, кажется, умнее способ сделать все в Python; есть ли более разумный способ сделать это, или конструкцию, о которой я не знаю?

ответ

4

range является встроенным Python, поэтому не рекомендуется затенять его локальной переменной. Я использовал r здесь вместо

def isPrivate(ipaddress): 
    if any(ipaddress in IPv4Network(r) for r in ranges): 
     print 'private' 

Если есть возможность более одного матча, вы можете считать их заменой anysum с

private_count = sum(ipaddress in IPv4Network(r) for r in ranges) 

так True значения считаются 1

+1

Это немного другое поведение, так как он печатает только «private» не чаще одного раза. Я знаю, что это, вероятно, то, что нужно. –

+1

@PeterWood, я предположил, что диапазоны не перекрывались –

+1

Несомненно, просто отметив это. –

0

Не уверен, что вы имеете в виду «зарезервировано», но класс IPv4Address имеет is_private и i s_reserved атрибуты, которые могут удовлетворить ваши потребности

+1

Судя по OP, пример '100.64.1.1' должен считаться закрытым. –

+0

@Alex C. Удобно, спасибо. См. Проблему, с которой я столкнулся, но здесь: http://stackoverflow.com/questions/30996001/python-ipaddress-addressvalueerror-at-least-3-parts-expected – Pyderman

Смежные вопросы