用 None 来描述具有动态默认值的参数


默认值传参时,实参是可变类型,一定用 None 作为形参默认值。


例如:打印日志,把记录时间标注在消息中。

import datetime
import time

def log(message, when=datetime.datetime.now()):
    print(when, message)

log("Hi, wangke")
time.sleep(1)
log("Hi, qinlu")
2022-03-02 13:38:50.738963 Hi, wangke
2022-03-02 13:38:50.738963 Hi, qinlu

时间戳一样,这是因为 datetime.datetime.now()只执行了一次,也就是参数的默认值仅在函数定义的时候赋值一次

若正确实现动态默认值,习惯把默认值设为 None

def log(message, when=None):
    when = datetime.datetime.now() if when is None else when
    print(when, message)
2022-03-02 13:53:48.402329 Hi, wangke
2022-03-02 13:53:49.402345 Hi, qinlu


例如:从 JSON 格式的数据中载入某个值,若解码失败,返回空字典。

import json

def decode(data, default={}):
    try:
        return json.loads(data)
    except ValueError:
        return default

foo = decode('data1')
foo['age'] = 18
bar = decode('data2')
bar['name'] = 'wangke'
print(foo)
print(bar)
{'age': 18, 'name': 'wangke'}
{'age': 18, 'name': 'wangke'}

参数的默认值仅在函数定义时赋值一次,所以foobar 都写在同一个字典。

def decode(data, default=None):
    default = {} if default is None else default
    try:
        return json.loads(data)
    except ValueError:
        return default
{'age': 18}
{'name': 'wangke'}

要点:

① 默认值传参时,参数的默认值仅在函数定义时赋值一次。对 {}[]等动态值,会产生奇怪的结构。

② 默认值传参时,实参是可变类型,形参的默认值应写为 None



posted @   做梦当财神  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示