【问题标题】:argparse choices structure of allowed values允许值的 argparse 选择结构
【发布时间】:2013-01-17 21:11:41
【问题描述】:

使用与Python dependencies between groups using argparse 相关的argparse,我有一个解析器的某个解析器组的参数部分 - 例如:

group_simulate.add_argument('-P',
                            help='simulate FC port down',
                            nargs=1,
                            metavar='fc_port_name',
                            dest='simulate')

如何使用choices 将选择限制为下一个结构的参数列表:

1:m:"number between 1 and 10":p:"number between 1 and 4"

我尝试使用范围选项,但找不到创建可接受选项列表的方法

例子: 合法参数:

test.py -P 1:m:4:p:2

非合法参数:

test.py -P 1:p:2
test.py -P abvds

非常感谢大家的帮助!

【问题讨论】:

    标签: python argparse


    【解决方案1】:

    您可以定义一个自定义类型,如果该字符串将引发argparse.ArgumentTypeError 与您需要的格式不匹配。

    def SpecialString(v):
        fields = v.split(":")
        # Raise a value error for any part of the string
        # that doesn't match your specification. Make as many
        # checks as you need. I've only included a couple here
        # as examples.
        if len(fields) != 5:
            raise argparse.ArgumentTypeError("String must have 5 fields")
        elif not (1 <= int(fields[2]) <= 10):
            raise argparse.ArgumentTypeError("Field 3 must be between 1 and 10, inclusive")
        else:
            # If all the checks pass, just return the string as is
            return v
    
    group_simulate.add_argument('-P',
                            type=SpecialString,
                            help='simulate FC port down',
                            nargs=1,
                            metavar='fc_port_name',
                            dest='simulate')
    

    更新:这是一个完整的自定义类型来检查值。所有检查已完成 在正则表达式中,虽然它只给出一个通用错误消息 如果任何部分有问题。

    def SpecialString(v):
        import re  # Unless you've already imported re previously
        try:
            return re.match("^1:m:([1-9]|10):p:(1|2|3|4)$", v).group(0)
        except:
            raise argparse.ArgumentTypeError("String '%s' does not match required format"%(v,))
    

    【讨论】:

    • 好的,非常感谢 chepner 的评论,我实际上一直在寻找一些像正则表达式“技巧”来检查参数的值,但定义一个动作也是一种解决方案,跨度>
    • 您可以使用正则表达式进行大部分检查;查看我即将发布的更新。
    • 感谢@chepner 的更新,这是在检查合法性的附加方法中使用正则表达式的一个很好的例子。
    • 谢谢。第一个示例中的一个小修复: if len(v) != 5: 应该是 if len(fields) != 5:
    • 您可以将正则表达式中的(1|2|3|4) 替换为更简洁的[1-4]
    【解决方案2】:

    如果我正确理解了这个问题,您只是在寻找:

    group_simulate.add_argument('-P',
                                help='simulate FC port down',
                                type=int, 
                                metavar='fc_port_name',
                                dest='simulate',
                                choices=range(1, 10)) # answer
    

    来源:https://docs.python.org/3/library/argparse.html#choices

    【讨论】:

      猜你喜欢
      • 2022-07-07
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 2012-09-09
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      相关资源
      最近更新 更多