【问题标题】:Display error when argument is specified multiple times [duplicate]多次指定参数时显示错误[重复]
【发布时间】:2019-03-31 03:23:11
【问题描述】:

当多次指定同一个参数时,默认的 argparse 行为是最后一个指定的值“获胜”,覆盖之前的值。我希望 argparse 在多次指定相同参数时显示错误,而不是默默地覆盖第一个指定值。

如何做到这一点?

我当前的代码:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument(
    '-t', '--test',      # either of this switches
    type=str,            # parameter is string
    dest='test',         # store in 'test'.
    required=True        # required
)

调用脚本:

myscript.py -t hello -t world

不会出错,test 的值为 world。在这种情况下,我希望 argparse 显示一个错误,因为从我的角度来看,默认行为很容易出错。

【问题讨论】:

    标签: python argparse


    【解决方案1】:

    最简单的选择是使用action="append" 并检查结果是否有len > 1:

    parser.add_argument(
        '-t', '--test',
        type=str,
        dest='test',
        action='append',
        required=True
    )
    
    args = parser.parse_args()
    
    if len(args.test) > 1:
       ...error
    

    但更好的方法是在解析器中解决问题,以便获得统一的错误处理。这可以通过这样的自定义操作来完成:

    class Once(argparse.Action):
        def __call__(self, parser, namespace, values, option_string=None):
            if hasattr(self, 'seen'):
                raise argparse.ArgumentError(self, 'only one please')
            setattr(self, 'seen', True)
            setattr(namespace, self.dest, values)
    
    
    parser = argparse.ArgumentParser()
    parser.add_argument(
        '-t', '--test',
        type=str,
        dest='test',
        action=Once,
        required=True
    )
    

    【讨论】:

    • 谢谢!以前没找到重复的,但是比较重复和这个之后,我更喜欢这个,argpase.ArgumentError的错误对我来说看起来更好。
    • 谢谢,但请查看我的更新。 if getattr(namespace... 的默认参数有问题,显式标志似乎更清晰。
    猜你喜欢
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    相关资源
    最近更新 更多