Python 函数动态参数值设为 None 的意义
程序员文章站
2022-07-02 08:53:21
本文整理自《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