如何在 python 中使用 optparse 解析有效的 IP4/IPV6 地址?
How to parse a valid IP4/IPV6 address using optparse in python?
就像我想解析 127.0.0.1
它可以被正确解析但是 127.0.a.1
不是一个有效的 ip 地址所以它应该抛出一个错误。如何在 python?
中使用 optparse 执行此操作
喜欢解析整数或字符串值的我们使用
parser.add_option("-n", action="store", type="int", dest="number")
但是为了解析一个有效的 ip 地址,我们应该写什么?
我认为使用这个 section of the optparse documentation, this SO answer(解决与 argparse 完全相同的问题)可以适用于 optparse。
大致思路如下:
- 定义一个函数来检查输入是否满足给定条件(逻辑已经在 argparse 答案中完成,结构在我链接的 optparse 文档中)
- 为类型 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>
。捕获 any 异常不是好的做法(参见 Why is "except: pass" a bad programming practice?)。
也可以考虑使用 argparse instead of optparse, both work in python2.7. Why use argparse rather than optparse?
就像我想解析 127.0.0.1
它可以被正确解析但是 127.0.a.1
不是一个有效的 ip 地址所以它应该抛出一个错误。如何在 python?
喜欢解析整数或字符串值的我们使用
parser.add_option("-n", action="store", type="int", dest="number")
但是为了解析一个有效的 ip 地址,我们应该写什么?
我认为使用这个 section of the optparse documentation, this SO answer(解决与 argparse 完全相同的问题)可以适用于 optparse。
大致思路如下:
- 定义一个函数来检查输入是否满足给定条件(逻辑已经在 argparse 答案中完成,结构在我链接的 optparse 文档中)
- 为类型 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>
。捕获 any 异常不是好的做法(参见 Why is "except: pass" a bad programming practice?)。
也可以考虑使用 argparse instead of optparse, both work in python2.7. Why use argparse rather than optparse?