欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python 函数动态参数值设为 None 的意义

程序员文章站 2022-04-03 10:19:12
本文整理自《Effective Python 编写高质量 Python 代码的 59 个有效方法》第 20 条:用 None 和文档字符串来描述具有动态默认值的参数参数的默认值,只会在程序加载模块并读到本函数的定义时评估一次。对于{} 或 [ ] 等动态的值,可能会导致奇怪的行为。对于以动态值作为实际默认值的关键字参数来说,应该把形式上的默认值写为 None,并在函数的文档字符串里描述该默认值所对应的实际行为。例1例如:from time import *from datetime import...

本文整理自《Effective Python 编写高质量 Python 代码的 59 个有效方法》第 20 条:用 None 和文档字符串来描述具有动态默认值的参数

参数的默认值,只会在程序加载模块并读到本函数的定义时评估一次。对于{} 或 [ ] 等动态的值,可能会导致奇怪的行为。

对于以动态值作为实际默认值的关键字参数来说,应该把形式上的默认值写为 None,并在函数的文档字符串里描述该默认值所对应的实际行为。

例1

例如:

from time import *
from datetime import *


def log(message, when=datetime.now()):
    print(f"{when}:{message}")


if __name__ == '__main__':
    log("Hi there!")
    sleep(1)
    log("Hi again!")

两次打印实际均是加载模块的时间:

2020-07-28 15:11:00.187906:Hi there!
2020-07-28 15:11:00.187906:Hi again!

应该修改为:

from time import *
from datetime import *


def log(message, when=None):
    when = datetime.now() if when is None else when
    print(f"{when}:{message}")


if __name__ == '__main__':
    log("Hi there!")
    sleep(1)
    log("Hi again!")

最终将会得到运行代码语句时有间隔的时间:

2020-07-28 15:28:11.383553:Hi there!
2020-07-28 15:28:12.385956:Hi again!

例2

参数默认为空字典,想通过函数获取两个不同的字典,但却返回的是同一个字典:

import json


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


if __name__ == '__main__':
    foo = decode("bad data")
    foo['stuff']=5
    bar = decode("also bad")
    bar['meep']=1
    print("Foo:",foo)
    print("Bar:",bar)

这里错误的原因是 foo 和 bar 都等同于在 default 参数默认值中的那个字典,它们表示的是同一个字典对象。解决办法是把关键字的默认值设为 None:

import json


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


if __name__ == '__main__':
    foo = decode("bad data")
    foo['stuff']=5
    bar = decode("also bad")
    bar['meep']=1
    print("Foo:",foo)
    print("Bar:",bar)

再次运行代码,结构符合预期:

Foo: {'stuff': 5}
Bar: {'meep': 1}

本文地址:https://blog.csdn.net/weixin_40796925/article/details/107637505