Как разобрать действительный адрес IP4 / IPV6, используя optparse в python? - PullRequest
0 голосов
/ 11 мая 2018

Как я хочу проанализировать 127.0.0.1, он может быть проанализирован правильно, но 127.0.a.1 не является действительным IP-адресом, поэтому он должен выдать ошибку. Как это сделать с помощью optparse в python?

Как анализировать целое или строковое значение, которое мы используем

parser.add_option("-n", action="store", type="int", dest="number")

но для анализа действительного IP-адреса, что мы должны написать?

1 Ответ

0 голосов
/ 12 мая 2018

Я думаю, что, используя этот раздел документации optparse , этот SO ответ (который описывает тот же вопрос с помощью argparse) можно адаптировать к optparse.

Идея в основном заключается в следующем:

  1. Определить функцию, которая проверяет, соответствует ли ввод заданному условию (логика уже выполнена в ответе argparse, а структура приведена в документации optparse Iсвязанный)
  2. Определите новую опцию для параметра типа optparse.
  3. Используйте этот пользовательский тип для аргумента IP

Следовательно, код будет выглядеть следующим образом:

from copy import copy
from optparse import OptionParser, Option, OptionValueError 
import re

# define checker function
def check_ip(option, opt, value):
    try:
        return re.match(r'(\d{3}(\.\d){3})', value).group(0) # I added some 
        # parethesis to the comment in order to define the IP as group(0)
    except: # I think re.match().group() would raise an AttributeError, check it
        raise OptionValueError(
            "option %s: invalid IP value: %r" % (opt, value))

# define new optparse option
class MyOption(Option):
    TYPES = Option.TYPES + ("IP",)
    TYPE_CHECKER = copy(Option.TYPE_CHECKER)
    TYPE_CHECKER["IP"] = check_ip

# use optparser with the new option
parser = OptionParser(option_class=MyOption)
parser.add_option("-c", type="IP")

Комментарии

Проверьте ошибку, полученную от re.match, и напишите except <error_type>.Не рекомендуется перехватывать любое исключение (см. Почему "кроме: пройти" - плохая практика программирования? ).

Также рассмотрите возможность использования argparse вместо optparse оба работают в python2.7. Зачем использовать argparse, а не optparse?

...