gpt4 book ai didi

Python argparse : mutually exclusive arguments with optional and positional argument

转载 作者:太空宇宙 更新时间:2023-11-03 21:31:55 24 4
gpt4 key购买 nike

我想通过 argparse 库得到这个:

PROG --yesterday | begin-date [end-date]

我尝试将互斥和争论组结合起来,但没有成功。

这个程序应该只接受:

PROG --yesterday
PROG 2015-11-12
PROG 2015-11-12 2015-11-15

可以用 argparse 来做到这一点吗?

<小时/>

谢谢hpaulj。查看最终结果:

import argparse
from datetime import datetime
import pytz


def argument_date(str_date):
try:
return datetime.strptime(str_date, "%Y-%m-%d").replace(tzinfo=pytz.utc)
except ValueError as e:
raise argparse.ArgumentTypeError(e)

parser = argparse.ArgumentParser(prog='PROG')
parser.usage = """PROG [-h] [--yesterday | start [end]]"""
parser.add_argument('start', type=argument_date, nargs='?', help='Start date (format YYYY-MM-DD)')
parser.add_argument('end', type=argument_date, nargs='?', help='End date (format YYYY-MM-DD)')
parser.add_argument('--yesterday', action='store_true', help='Only yesterday')

args = parser.parse_args()

if args.yesterday and args.start:
raise parser.error("--yesterday option is not incompatible with start argument")

if not args.yesterday and not args.start:
raise parser.error("--yesterday option or start argument should be filled")

if args.end and (args.start >= args.end):
raise parser.error("end argument should be granter than start")

最佳答案

--yesterday 是多余的,因为它只是将 start_date 设置为昨天的快捷方式。相反,让“yesterday”成为 start_date 的允许值。事实上,您可以根据需要概括 datetime 以允许任一参数使用其他缩写。例如:

def argument_date(str_date):
# Not the most efficient to roundtrip like this, but
# fits well with your existing code
now = datetime.datetime.utcnow().date()
if str_date == "yesterday":
str_date = str(now - datetime.timedelta(1))
elif str_date == "today"
str_date = str(now)

try:
return datetime.strptime(str_date, "%Y-%m-%d").replace(tzinfo=pytz.utc)
except ValueError as e:
raise argparse.ArgumentTypeError(e)

完成此操作后,您的代码将变为:

parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('start', type=argument_date, help='Start date (YYYY-MM-DD, yesterday, today)')
parser.add_argument('end', type=argument_date, nargs='?', help='End date (YYYY-MM-DD, yesterday, today)')

关于Python argparse : mutually exclusive arguments with optional and positional argument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53468653/

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