如何在python中使用optparse解析有效的IP4 / IPV6地址?

时间:2018-05-10 22:39:39

标签: python python-2.7 optparse

就像我要解析127.0.0.1一样,它可以被正确解析,但127.0.a.1不是有效的IP地址,所以它应该抛出一个错误。如何在python中使用optparse?

要解析整数或字符串值,我们使用

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

但是为了解析有效的IP地址我们应该写什么?

1 个答案:

答案 0 :(得分:0)

我认为使用此section of the optparse documentationSO answer(与argparse完全相同的问题)可以适应optparse。

这个想法基本上如下:

  1. 定义一个函数,检查输入是否满足给定条件(逻辑已经在argparse答案中完成,结构在我链接的optparse文档中)
  2. 为optparse类型参数定义一个新选项。
  3. 将此用户定义类型用于IP参数
  4. 因此,代码如下所示:

    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>。捕获任何异常(参见Why is "except: pass" a bad programming practice?

    是不好的做法

    另外考虑使用argparse而不是optparse,两者都在python2.7中工作。 Why use argparse rather than optparse?