You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python argparse的nargs实现1必选1可选的日期范围参数配置?

实现方案

这个需求完全可以实现,仅需对现有代码做少量调整即可,核心修改逻辑如下:

  • 将--date-range参数的nargs属性从固定值2改为'+',支持接收1个及以上的入参,同时配置required=True强制用户必须传入该参数,满足最少传1个日期的要求
  • 参数解析完成后先校验日期参数的长度,根据长度做分支处理:长度为1时默认结束日期等于开始日期,长度大于2时直接抛出错误提示,满足最多传2个日期的要求
  • 可选优化:将日期字符串转为datetime对象校验格式合法性,避免无效日期或字符串格式不统一导致的逻辑错误

修改后完整代码

import argparse
import os
import sys
from datetime import datetime

def run_job(meta):
    # 你原有任务执行逻辑
    pass

def main(args):
    parser = argparse.ArgumentParser(description="运行ETL脚本")
    
    parser.add_argument('-j', '--job_name', default=os.path.basename(__file__), type=str, help="任务名称,作为任务运行元数据的一部分")
    # 核心修改:nargs改为'+',required设为True,移除固定默认值
    parser.add_argument("-d", "--date-range", nargs='+', metavar=('start_date', 'end_date'), required=True, help="脚本和数据源的运行日期范围,支持传1个(单天)或2个(起止)日期,格式为YYYY-MM-DD")
    parser.add_argument('-e', '--env', choices=['dev', 'stage', 'prod'], default='dev', help="运行环境")
    parser.add_argument('-c', '--config', choices=['small', 'medium', 'large'], default='small', help="资源配置规格,详见各配置说明") 
    
    args = parser.parse_args()
    date_list = args.date_range

    # 校验日期参数数量
    if len(date_list) > 2:
        print("错误:日期参数最多仅支持传入2个(开始日期、结束日期)")
        sys.exit(1)
    
    # 处理单日期场景
    if len(date_list) == 1:
        start_date_str = end_date_str = date_list[0]
    else:
        start_date_str, end_date_str = date_list

    # 可选:校验日期格式合法性 + 日期大小比较
    try:
        start_date = datetime.strptime(start_date_str, "%Y-%m-%d")
        end_date = datetime.strptime(end_date_str, "%Y-%m-%d")
    except ValueError:
        print("错误:日期格式无效,请使用YYYY-MM-DD格式")
        sys.exit(1)

    if start_date > end_date:
        print('错误:日期范围无效,开始日期不能晚于结束日期')
        sys.exit(1)

    job_meta = {
        "script" : args.job_name,
        "start_date" : start_date_str,
        "end_date" : end_date_str,
        "environment" : args.env,
        "resource" : args.config
    }
    run_job(job_meta)

if __name__ == "__main__":
    main(sys.argv[1:])

使用示例

  • 单日期运行:python etl_script.py -d 2024-05-20,此时起止日期均为2024-05-20
  • 日期范围运行:python etl_script.py -d 2024-05-01 2024-05-10,此时开始日期为2024-05-01,结束日期为2024-05-10
  • 传入超过2个日期时会直接报错终止,符合参数限制要求

内容的提问来源于stack exchange,提问作者Jammy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 00:27:03