Нахождение первого и последнего IP в строку IP-диапазон


Я очень новой для Python и сценария в целом. Я придумал следующую функцию, чтобы найти первый и последний IP, когда строку IP-диапазон вводится. Я хочу использовать только базовую версию Python (и не скачать практически любой библиотеки).

Пример:

genRange("1.2.3.*"):
Start IP = 1.2.3.0
End IP = 1.2.3.255

genRange("1.*"):
Start IP = 1.0.0.0
End IP = 1.255.255.255

genRange("1.2.3.4"):
Start IP = 1.2.3.4
End IP = 
NotRange

Мне кажется это очень жестко, потому что это действительно. Есть ли лучший способ сделать это, что очевидно/прыгает на вас?

Я по-прежнему должны обращаться неверный ввод.

def genRange(ipRangeString):
    startIP = ""
    endIP = ""
    if '.' in ipRangeString:
        ipV = 4
    if ':' in ipRangeString:
        ipV= 6
    if ipV == 4:
        parts = ipRangeString.split(".")
        i = 0
        for item in parts:
            if item != "*":
                if 0 <= int(item) <= 255:
                    if (i<=3):
                        startIP = startIP + item + '.'
                        if (i==3): startIP = startIP[:-1]
                    i+= 1
            else:
                tempSIP = startIP
                endIP = startIP
                while (i<=3):
                    endIP = endIP + "255"
                    startIP = startIP  + "0"
                    if (i<3):
                        endIP = endIP + '.'
                        startIP = startIP + '.'
                    i+= 1
    print "Start IP = ", startIP
    print "  End IP = ", endIP
    if not (endIP):
        print "NotRange"


639
2
задан 29 ноября 2011 в 06:11 Источник Поделиться
Комментарии
1 ответ

Первое, что бросается в глаза мне, что это единственная функция, без классов и только один можно использовать. Но без контекста, я не могу прокомментировать, является ли это хорошо. Поскольку фрагмент так коротка и ограничена, ваша единственная мотивация для его изменения является то, что вы, возможно, захотите использовать его в более широком контексте. Так что я собираюсь предположить более широком контексте, который может или не может применяться.

Вторая вещь заключается в том, что нет замечаний. Я могу смотреть на этот код, увидеть ИПВ 4 или 6, смотри "старт IP" и "IP-адрес", и выяснить, что это вычисления диапазона IP-адресов для IPv4. Но имя функции не рассказывал. Только на ремонтопригодность ради, вы могли бы хотеть сделать что-то об этом.

Третье, что бросается в глаза мне, что эта функция не делает ничего полезного. Он имеет две (условно 3) для печати заявления в качестве побочных эффектов, который означает, что вы не можете использовать эти результаты. Вы, возможно, захотите, чтобы отделить вычисление диапазоне от печати результатов. Это где я должен считать более широком контексте. Если вы хотите просто распечатать эти 2 или 3 линии, зачем изменять рабочий код, чтобы начать с другой, чем может быть, добавить некоторые замечания на будущее. Что если вы хотите принять диапазонов (10.0.1.5-50)? Черт, что, если вы хотите диапазонов с отверстиями (10.0.5-10.2-100)?

В-четвертых, ваша переменная i-это индекс элемента в цикле, который используется в много логики в вашей функции. См https://stackoverflow.com/questions/522563/accessing-the-index-in-python-for-loops для дополнительного обсуждения. В частности, не управлять переменной собственный индекс цикла. Я понимаю, почему вы делаете так, чтобы петли нужное количество раз между 1.* и 1.1.*. Вы можете сделать это несколькими разными способами. Статически, вам нужно 4 части для вашего адресов IPv4. Вы могли бы перебрать диапазон 4 и генерировать эти 4 части. Вы могли бы перебрать свой входной части и добавить недостающие части по мере необходимости после завершения. Я на самом деле не имеют твердого мнения на правильный путь, только, что ваш образ выглядит смешно для меня.

В-пятых, tempSIP. важно? использовать?

Концовка не предполагая более широкий контекст: Добавить отзыв об использовании. Добавление комментария о логике программы. Переименовать функцию, чтобы иметь IP в имя. Удалить tempSIP.

7
ответ дан 29 ноября 2011 в 07:11 Источник Поделиться