【发布时间】:2015-12-18 21:18:42
【问题描述】:
我想通过 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而不是允许yesterday作为begin-date的特殊值? -
start和end参数应该是一个日期时间对象而不是一个简单的字符串。所以,我认为从数据的角度来看是不一致的。 -
所有参数都是简单的字符串,直到你真正把它们变成
datetimeobjects。在此之前检查“昨天”之类的特殊情况是一件相对简单的事情。