【问题标题】:Python Argparser make argument mutually exclusivePython Argparse 使参数互斥
【发布时间】:2020-07-29 17:03:18
【问题描述】:

我正在尝试在我的项目中使用argparse。我有两个论点,我想与其他论点相互排斥。

代码

parser = argparse.ArgumentParser(description='List keys in S3 bucket for prefix')
parser.add_argument('-b', '--bucket', help='S3 Bucket', required=True)

date_parser = parser.add_argument_group("for date")
date_parser.add_argument('-n', '--last_modified_min', default=None, type=valid_datetime, help='Filter s3 content by minimum last modified date')
date_parser.add_argument('-x', '--last_modified_max', default=None, type=valid_datetime, help='Filter s3 content by maximum last modified date')

time_parser = parser.add_argument_group("for time")
time_parser.add_argument("-m", '--modified_time', help="")
time_parser.add_argument("-t", '--modified_time_type', choices=("minutes", "hours", "days"), help="")

我该如何配置,用户可以从time_parser 组或date_parser 组输入,但不能同时从两者输入。 即以下应该是无效的。因为-xdate_parser 的一部分。

python test.py -b aa -m 1 -t hour -x 2020-01-01 

更新:

我想出了这个。然而,它看起来并不优雅。

    args = parser.parse_args()
    if bool(args.modified_time) ^ bool(args.modified_time_type):
        parser.error("--modified_time and --modified_time_type must be given togather")

    if (bool(args.modified_time) and bool(args.modified_time_type)) and (args.last_modified_min or args.last_modified_max):
        parser.error("--last_modified_min or --last_modified_max can't be given with --modified_time")

【问题讨论】:

  • argument_group 仅用于帮助显示。它没有任何类型的“多包容性”属性。

标签: python python-2.7 argparse


【解决方案1】:

我之前尝试过这样做,但我认为它不受支持。

add_mutually_exclusive_group 只允许从组中选择一个参数,如果您尝试嵌套它们,它只会使组变平。

您可以使用add_subparsers 来选择您是处于日期模式还是时间模式,但这会使脚本的界面非常糟糕。

我知道的最佳解决方案是在parse_args 之后手动处理逻辑,如果有问题,请致电parser.error

【讨论】:

    猜你喜欢
    • 2021-12-20
    • 2011-06-09
    • 2017-01-17
    • 2011-06-13
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多