Python argparse默认日期参数如何保留前导零输出01格式
问题根源
你给参数设置了type=int,Python的整数类型不会保留前导零:字符串"01"转成整数后是数值1,整数本身没有“前导零”的存储属性,直接打印必然输出1,不可能得到01。
解决方法
根据你后续是否需要对这个日期值做数值运算,选对应方案即可:
方案1:直接存储为两位格式的字符串(推荐,无需额外格式化)
不需要做数值计算的话,直接把参数类型改为str即可,strftime("%d")本身输出的就是带前导零的两位字符串,默认值可以直接生效。如果要兼容用户输入1位数字的场景,写个简单的自定义类型转换函数做校验和补零就行:
import datetime import argparse # 计算默认日期值 two_days_ago = datetime.date.today() - datetime.timedelta(days=2) default_day = two_days_ago.strftime("%d") def format_day_input(input_val: str) -> str: """校验输入的日份合法性,统一返回两位带前导零的字符串""" day_num = int(input_val) if not 1 <= day_num <= 31: raise argparse.ArgumentTypeError("日期日份必须为1-31之间的有效数字") return f"{day_num:02d}" parser = argparse.ArgumentParser() # 注意原代码里的const="num"是无效配置:const仅对带-前缀的可选参数、且指定参数但不传值时生效,位置参数用不到,直接删除即可 parser.add_argument( "number", type=format_day_input, help="代表日期(日)的数字", nargs="?", default=default_day ) args = parser.parse_args() print(args.number)
无参数传入时,上述代码会直接输出01这类两位格式的日期;即使用户输入1,最终也会被自动格式化为"01"。
方案2:保留整数类型,打印时做格式化
如果后续需要用这个参数做数值计算,没必要在存储阶段强行保留前导零——前导零只是展示格式,打印的时候手动格式化输出即可:
# 参数定义保持整数类型 parser.add_argument( "number", type=int, help="代表日期(日)的数字", nargs="?", default=int(default_day) ) args = parser.parse_args() # 打印时补前导零 print(f"{args.number:02d}")
数值1经过上述格式化后会输出01,数值23会正常输出23,完全符合展示要求。
内容的提问来源于stack exchange,提问作者Yash
相关产品推荐
相关产品推荐

