Python format()函数使用问题:lambda表达式未正确格式化日期字符串
问题分析与解决:Python Lambda中format()的使用错误
原代码与问题现象
原代码如下:
Months={"01":"January","02":"February","03":"March","04":"April","05":"May","06":"June","07":"July","08":"August","09":"September","10":"October","11":"November","12":"December"} date_time = lambda D: "{day} {month} {year} year {hour} hour"+"{p1} "+"{minute} minute"+"{p2}".format(day=str(int(D.split('.')[0])),month=Months[D.split('.')[1]],year=D.split('.')[2].split(' ')[0],hour=str(int(D.split(' ')[1].split(':')[0])),p1=''if D.split(' ')[1].split(':')[0]=='01' else 's',minute=str(int(D.split(' ')[1].split(':')[1])),p2=''if D.split(' ')[1].split(':')[1]=='01' else 's')
预期执行效果:
date_time("01.01.2000 00:00") == "1 January 2000 year 0 hours 0 minutes"
实际执行效果:
date_time("01.01.2000 00:00") == "{day} {month} {year} year {hour} hour{p1} {minute} minute{p2}"
问题原因
核心错误是format()方法仅作用在最后一个字符串片段"{p2}"上,前面的"{day} {month} {year} year {hour} hour"、"{p1} "、"{minute} minute"都是未被格式化的普通字符串,拼接后自然保留了占位符。原代码的写法相当于把多个字符串拼接后,仅对最后一部分做格式化,前面的占位符完全没被处理。
解决方案
方式1:修正format()的作用范围
把所有需要格式化的字符串合并成一个整体,再统一调用format()方法:
Months={"01":"January","02":"February","03":"March","04":"April","05":"May","06":"June","07":"July","08":"August","09":"September","10":"October","11":"November","12":"December"} date_time = lambda D: "{day} {month} {year} year {hour} hour{p1} {minute} minute{p2}".format( day=str(int(D.split('.')[0])), month=Months[D.split('.')[1]], year=D.split('.')[2].split(' ')[0], hour=str(int(D.split(' ')[1].split(':')[0])), p1='' if D.split(' ')[1].split(':')[0] == '01' else 's', minute=str(int(D.split(' ')[1].split(':')[1])), p2='' if D.split(' ')[1].split(':')[1] == '01' else 's' )
方式2:优化可读性(推荐)
原代码重复调用多次split,冗余且降低可读性,可以先拆分出日期和时间部分,再提取各字段:
Months={"01":"January","02":"February","03":"March","04":"April","05":"May","06":"June","07":"July","08":"August","09":"September","10":"October","11":"November","12":"December"} def date_time(D): date_part, time_part = D.split(' ') day, month, year = date_part.split('.') hour, minute = time_part.split(':') day_str = str(int(day)) month_str = Months[month] hour_str = str(int(hour)) minute_str = str(int(minute)) hour_suffix = '' if hour == '01' else 's' minute_suffix = '' if minute == '01' else 's' return f"{day_str} {month_str} {year} year {hour_str} hour{hour_suffix} {minute_str} minute{minute_suffix}"
(注:如果一定要用lambda,也可以把拆分逻辑整合进去,但可读性会变差,推荐用普通函数)
验证结果
调用修正后的函数:
print(date_time("01.01.2000 00:00")) # 输出:1 January 2000 year 0 hours 0 minutes print(date_time("01.01.2000 01:01")) # 输出:1 January 2000 year 1 hour 1 minute
内容的提问来源于stack exchange,提问作者Bounoua Ilyas
相关产品推荐
相关产品推荐

