Python argparse:带有可选和位置参数的互斥参数

发布于 2021-01-29 17:24:48

我想用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")
关注者
0
被浏览
158
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    最好的选择是在解析后测试值,如果需要,请提供自己的custom usage

    一个common_exclusive_group可以使用一个可选的位置,例如

    group = parser.add_mutually_exclusive_group()
    group.add_argument('-y','--yesterday', action='store_true')
    group.add_argument('dates',nargs='?')
    

    我以为它可以使用nargs='*',但ValueError: mutually exclusive arguments must be optional出现错误。

    因此,一个可选的位置值有效,但是无法将此测试与2个可选的位置值一起使用。

    parser.add_argument('--yesterday',action='store_true')
    parser.add_argument('start',nargs='?')
    parser.add_argument('end',nargs='?')
    

    然后测试args.yesterdayargs.start is Noneargs.end is None。如果这些组合的某些组合是错误的,请提出parser.error('....')

    只要您可以区分默认值和用户给定的值,解析后的测试与您可能强制解析器执行的任何操作一样好。

    考虑一下什么使用消息对您的用户来说也是一个好主意。例如

    例如:

    PROG  [--yesterday | [start [end]]]
    

    不是argparse可以自动生成的东西。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看