我正在尝试在项目中使用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
组中输入,但不能从两者中输入。
也就是说,追踪应该无效。因为-x
是date_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")
答案 0 :(得分:0)
我以前曾经尝试过这样做,但我相信它不受支持。
add_mutually_exclusive_group
仅允许从组中选择一个参数,如果尝试嵌套它们,则只会使组变平。
您可以使用add_subparsers
选择您是处于日期还是时间模式,但这会使脚本的界面很粗糙。
我所知道的最好的解决方案是在parse_args
之后手动处理逻辑,如果出现问题,请致电parser.error
。