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

Python默认参数datetime.date.today()返回Django启动日期问题

问题根因

这个现象和Django框架无关,是Python语言本身的函数默认参数机制导致的:

  • Python解释器加载函数定义的阶段,就会对默认参数的表达式求值,且求值结果会被永久绑定为该参数的默认值,不会在每次函数调用时重新计算默认值。

Django服务启动时,项目代码会被整体加载解释,执行到get_start_date的函数定义行时,会立刻运行datetime.date.today(),把服务启动当天的日期(也就是你打印结果里的2022-06-23)固定绑定为startDate、notUsed两个参数的默认值。后续不管间隔多少天调用函数,只要调用时没有显式传入这两个参数,用到的永远是函数定义那一刻计算出来的固定日期,这就是你打印时看到默认参数值和当前实际日期不一致的原因。

你最初实现的静态方法版本没有问题,是因为datetime.date.today()写在了函数体内部:函数体中的代码只有在函数被实际调用时才会执行,因此每次未传入startDate时,都会实时计算调用当日的日期,不会出现固定值问题。

正确重构写法

如果要把默认日期逻辑改成参数默认值形式,需要用None作为占位哨兵值,在函数体内做动态计算:

def get_start_date(startDate=None, notUsed=None, **kwargs):
    # 仅当参数未传入时,实时计算当日日期作为默认值
    if startDate is None:
        startDate = datetime.date.today()
    if notUsed is None:
        notUsed = datetime.date.today()
    print(startDate, notUsed, datetime.date.today())
    return startDate

注意:所有动态值(当前时间、随机数)、可变对象(列表、字典、类实例)都不要直接作为函数默认参数。除了本次遇到的固定值问题,可变对象作为默认参数时,还会出现多次函数调用共享同一个对象、数据互相污染的经典问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:18:16