我希望使用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
的特殊值? - chepnerstart
和end
参数应该是一个日期时间对象,而不是一个简单的字符串。因此,我认为从数据角度来看它并不一致。 - Auréliendatetime
对象。在这样做之前,检查特殊情况(如“昨天”)是相对简单的。 - chepner