【问题标题】:parsing argument in python在python中解析参数
【发布时间】:2016-04-13 20:35:31
【问题描述】:

我有一个问题,我正在努力寻找解决方案。我不确定是否可以使用 argparse。

我希望能够指定一个选项

myprog -a 1
myprog -a 2

现在当我有 a = 1 时,我希望能够指定 bc。但是当a = 2时,我只能指定d

myprog -a 1 -b 3 -c 0
myprog -a 2 -d 3

还必须始终指定a

【问题讨论】:

    标签: python parsing command-line-interface argparse


    【解决方案1】:

    您不能将切换值作为单个 parse_args 调用来执行此操作,但您可以执行以下操作之一:

    1. 使用sub-commands/sub-parsers
    2. 在完全配置解析器并在完整命令行上运行之前进行部分解析,首先只检查a,然后根据第一次调用的结果选择额外的解析器参数进行解析。诀窍是在第一次调用时使用parse_known_args,因此它会处理a(它可以识别)并忽略其他所有内容。

    例如,对于方法 #2,您可以这样做:

    parser = argparse.ArgumentParser()
    parser.add_argument('-a', required=True, type=int, choices=(1, 2)
    args = parser.parse_known_args()
    
    if args.a == 1:
        parser.add_argument('-b', ...)
        parser.add_argument('-c', ...)    
        args = parser.parse_args()
    else:
        parser.add_argument('-d', ...)
        args = parser.parse_args()
    

    这种方法的缺点是,由于错误使用而吐出的使用信息将不完整;您必须手动在基本解析器中包含指定“真实”用法的文本,这并不好玩。子解析器不能基于值开关进行切换,但它们具有统一、连贯的用法显示。

    【讨论】:

      【解决方案2】:

      最简单的解决方案是将'-a' 设为required=True 参数,并将其他参数保留为默认不需要。然后在解析后对 args.a 和其他值执行测试(我假设你可以编写那种 Python 逻辑)。

      您可以提出自己的错误,也可以使用parser.error("I don't like your input") 调用。

      许多人需要编写自定义usage 行。考虑到这些要求,什么是有意义的用法?

      有一个mutually exclusive argument group 方法,但它不使用特定的值,只是参数的存在与否。

      您还可以将测试合并到自定义 Action 类中。但通常这比在解析后执行测试更复杂(因为 argparse 处理以任何顺序出现的参数)。

      -a 参数转换为子解析器的另一种可能性。这允许您为一个“解析器”值定义一组参数,为另一个值定义另一组参数。我认为 argparse 文档对此已经足够清楚了。

      【讨论】:

        猜你喜欢
        • 2011-04-05
        • 2012-10-08
        • 2020-01-25
        • 2017-03-25
        • 1970-01-01
        • 2015-03-04
        • 1970-01-01
        • 2013-02-01
        • 2017-10-29
        相关资源
        最近更新 更多