@KPEBETKA

Python. Некрасивая конструкция While. Можно ли упростить?

Имеется функция:
def wildcard_iprange(ipaddr, sw):

	if sw:
		beginning = [ int(i) if not '-' in i else int(i.split('-')[0]) for i in ipaddr.split('.') ]
		e = [ int(i) if not '-' in i else int(i.split('-')[1]) for i in ipaddr.split('.') ]
		b = beginning[:]
	else:
		beginning = [ int(i) if i != '*' else 0 for i in ipaddr.split('.') ]
		e = [ int(i) if i != '*' else 255 for i in ipaddr.split('.') ]
		b = beginning[:]

	while b[0] <= e[0]:
		while b[1] <= e[1]:
			while b[2] <= e[2]:
				while b[3] <= e[3]:
					yield '%s.%s.%s.%s' % (b[0], b[1], b[2], b[3])
					b[3] = b[3] + 1
				b[2] = b[2] + 1
				b[3] = beginning[3]
			b[1] = b[1] + 1
			b[2] = beginning[2]
		b[0] = b[0] + 1
		b[1] = beginning[1]


Данная функция возвращает ip-адреса, исходя из того какая маска была передана при вызове.
Немного примеров того, что может быть передано:
192.168.1.*
192.168.*.*
192.*.1.*
....
Или
192.168.1-3.0-254
192-255.168.4-5.0-2
....
  • Вопрос задан
  • 2994 просмотра
Решения вопроса 1
@maxfox
Лапша у вас знатная..
Я правильно понимаю, что вам нужно просто вывести все ip по маске?

import itertools

s = '197.1-10.197.*'
sections = s.split('.')
addresses = []
for i in sections:
	if '-' in i:
		min,max = i.split('-')
		a = [x for x in range(int(min),int(max))]
	elif '*' in i:
		a = [x for x in range(0,255)]
	else:
		a = [int(i)]
	addresses.append(a)
addresses = itertools.product(*addresses)

for i in addresses:
        print i


PS Надо добавить валидацию входных данных и вывод как вам там нужно..
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
JRazor
@JRazor
Senior StarkOverFlow Programmer
Голова не работает после рабочего дня, но помоему можно попробовать что-то такое:

for num in range(0, 4):
    while b[num] <= e[num]:
        # yield
        b[num] += 1
        if b[num] <= e[num]:
            b[num + 1] = beggining[num + 1]

Скорее всего, код с ошибками. Также под вопросом и "упрощение функции".

И постарайтесь именовать переменные более читаемо.
Ответ написан
Комментировать
@maxfox
А еще лучше юзать ipaddress или IPy, если это часть проекта, а не скрипт для личного пользования.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы