当前位置: 移动技术网 > IT编程>脚本编程>Python > Python 函数动态参数值设为 None 的意义

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

2020年07月30日  | 移动技术网IT编程  | 我要评论

本文整理自《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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网