Я думаю, что, используя этот раздел документации optparse , этот SO ответ (который описывает тот же вопрос с помощью argparse) можно адаптировать к optparse.
Идея в основном заключается в следующем:
- Определить функцию, которая проверяет, соответствует ли ввод заданному условию (логика уже выполнена в ответе argparse, а структура приведена в документации optparse Iсвязанный)
- Определите новую опцию для параметра типа optparse.
- Используйте этот пользовательский тип для аргумента 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?