Python报'datetime.date' object is not callable 跨年日期循环异常
问题根因
报错和函数重复调用无关,本质是变量名覆盖了导入的日期类:
- 代码开头通过
from datetime import date导入了datetime模块的date类,allSundays函数内的date(year,1,1)本来是调用这个类生成日期对象。 - 完整代码最内层的打印循环使用
date作为循环变量:for date in monthDatesList:。Python中for循环定义的变量不会在循环结束后销毁,会留在当前作用域(这段循环写在全局位置,所以变量会留在全局作用域)。跑完2020年全流程后,全局的date已经不是一开始导入的类,而是monthDatesList中最后一个datetime.date类型的实例对象。 - 处理2021年再次调用
allSundays函数时,执行d = date(year, 1, 1)相当于尝试把一个日期实例当可调用对象执行,就会抛出TypeError: 'datetime.date' object is not callable错误。
精简代码可以正常运行的原因很直接:精简版遍历日期的循环变量命名为sundayDate,全程没有占用date这个标识符,导入的date类没有被覆盖,所以跨年执行也不会触发问题。
修复方案
只需要修改覆盖了date类的循环变量名即可,日常写代码也尽量不要用和导入类、内置函数同名的标识符当普通变量名,从根源避免这类覆盖问题:
# 把原代码最内层循环的变量名从date改成其他名字,比如report_date for report_date in monthDatesList: print(report_date)
修改后全局的date会始终指向导入的日期类,不管处理多少年都不会触发同类报错。
内容的提问来源于stack exchange,提问作者lost three 6 dove
相关产品推荐
相关产品推荐

