gpt4 book ai didi

python - argparse:需要在 1 个参数或参数组之间进行选择

转载 作者:太空狗 更新时间:2023-10-30 02:52:20 25 4
gpt4 key购买 nike

在我的 python 应用程序中,我的用户可以选择指定:

  • 一次约会
  • 日期范围(开始、结束)

我在 mutually_exclusive_group 中创建了一个嵌套的 argument_group:

argument_group
+--- mutually_exclusive_group
+--- date (argument)
+--- argument_group
+--- start (argument)
+--- end (argument)

我想向我的用户表明 要么 日期 (start, end) 是需要,并且如果他们选择组,则两者 (start, end) 都是必需的:

这是我目前所拥有的:

ap = argparse.ArgumentParser()
grp = ap.add_argument_group('test dates')
date_group = grp.add_mutually_exclusive_group(required=True)

date_group.add_argument('--date', help='date (YYYYMMDD)')
date_range = date_group.add_argument_group('date range')

date_range.add_argument('--start',help='start date (YYYYMMDD)', required=True)
date_range.add_argument('--end', help='end date (YYYYMMDD)', required=True)

问题 1:

指定 (start, end) 不起作用,因为 argparse(我猜)看不到我已经指定了 argument_group 部分>mutually_exclusive_group 而不是 date,并且由于 mutually_exclusive_group 是必需的,它拒绝:

$ ./app.py --start 20180101 --end 20180102
usage: app.py [-h] --date date --start date --end date
app.py: error: one of the arguments --date is required

我可以通过使 mutually_exclusive_group 不需要来解决这个问题,但这显然是不正确的,并且不会捕捉到指定nothing的情况(因为它,实际上是必需的)

问题 2:

不幸的是,上面的帮助并没有反射(reflect)我的意图:

如果我没有嵌套组,mutually_exclusive_group 中的选项周围没有(option_1 | option_2)

此外,startend 的帮助甚至都没有显示。

$ ./app.py --help
usage: app.py [-h] --date date --start date --end date

optional arguments:
-h, --help show this help message and exit

test dates:
--date date date (YYYYMMDD) (default: None)

我想要的是:

$ ./app.py --help
usage: app.py [-h] (--date date | --start date --end date)

optional arguments:
-h, --help show this help message and exit

test dates:
--date date date (YYYYMMDD) (default: None)
--start date start date (YYYYMMDD) (default: None)
--end date end date (YYYYMMDD) (default: None)

如何在参数和参数组之间表达这个必需的选择?

最佳答案

鉴于您的评论,如果给出了 --date,则 start == end,我会保持简单并坚持使用两个参数:

class DefaultEnd(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
setattr(namespace, self.dest, values)
setattr(namespace, 'end', values)

ap = argparse.ArgumentParser()
ap.add_argument('--start', help='date (YYYYMMDD) Mandatory', action=DefaultEnd, required=True)
ap.add_argument('--end', help='date (YYYYMMDD) Optional, defaulted to START if not provided')

使用自定义 argparse.Action 如果只提供后者,它还默认 --end--start:

optional arguments:
-h, --help show this help message and exit
--start START date (YYYYMMDD) Mandatory
--end END date (YYYYMMDD) Optional, defaulted to START if not provided

所以如果给定参数:

args = ap.parse_args(['--start','20100102', '--end', '20121123'])
# args.start = 20100102
# args.end = 20121123

如果不是:

args = ap.parse_args(['--start','20100102'])

# args.start = 20100102
# args.end = 20100102

当然,如果您只是在解析后操作 args 并完全跳过自定义 argparse.Action,您当然也可以保持简单:

ap.add_argument('--end', help='date (YYYYMMDD) Optional, defaulted to START if not provided', default=None)

...

args.end = args.end if args.end else args.start

当然这可能会改变您的后参数代码的处理方式,因此如果您的代码必须需要 args.date,这些解决方案可能不适用于您。

关于python - argparse:需要在 1 个参数或参数组之间进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53522681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com