博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用 None 和文档字符串来描述具有动态默认值的参数
阅读量:2396 次
发布时间:2019-05-10

本文共 1070 字,大约阅读时间需要 3 分钟。

     如果参数的实际默认值是可变类型(mutable),那就一定要记得用 None 作为形式上的默认值。例如,从编码为 JSON 格式的数据中载入某个值。若解码数据时失败,则默认返回空的字典。我们可能会采用下面这种办法来实现此功能:

import jsondef decode(data,default = {}):      try:        json.loads(data)    except ValueError:        return defaultfoo = decode('bad data')foo['stuff'] = 'why'bar = decode('also bad')bar['meep'] = 'i dunno'  print('Foo',foo)    print('Bar',bar)

由于 default 参数的默认值只会在模块加载时评估一次,所以凡是以默认形式来调用 decode 函数的代码,都将共享同一份字典。

输出结果:

('Foo', {'stuff': 'why', 'meep': 'i dunno'})('Bar', {'stuff': 'why', 'meep': 'i dunno'})

我们本以为 foo 和 bar 会表示两份不同的字典,每个字典里都有一对键和值,但实际上,修改了其中一个之后,另外一个似乎也会受到影响。这种错误的根本原因是:foo 和 bar 其实都等同于写在 default 参数默认值中的那个字典,它们都表示的是同一个字典对象。

解决办法,是把关键字参数的默认值设为 None,并在函数的文档字符串中描述它的实际行为。

def decode(data,default = None):    if default is None:        default = {}    try:        json.loads(data)    except ValueError:        return default
现在,再来运行和刚才相同的测试代码,就能产生符合预期的结果了。

('Foo', {'stuff': 'why'})('Bar', {'meep': 'i dunno'})

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

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

转载地址:http://affob.baihongyu.com/

你可能感兴趣的文章
美国之行第六天(r12笔记第6天)
查看>>
美国旅行回来的一点感想(r12笔记第57天)
查看>>
MySQL和Oracle行值表达式对比(r11笔记第74天)
查看>>
说说地铁冲突和今天的游戏(r11笔记第94天)
查看>>
相差数十倍的SQL性能分析(r11笔记第98天)
查看>>
面试中的问题之我见
查看>>
动态创建MySQL Group Replication的节点(r11笔记第84天)
查看>>
我们父辈关于房子的事情(r11笔记第93天)
查看>>
我的女儿二三事(七)(r12笔记第58天)
查看>>
mysqlpump和mysqldump的性能大比拼(r12笔记第90天)
查看>>
人工智能时代,我们也要做些什么(r12笔记第88天)
查看>>
Oracle 12.1升级到12.2的两种方法
查看>>
Oracle数据库重启后密码失效的问题(r12笔记第91天)
查看>>
今天的十点想法(r12笔记第94天)
查看>>
压测工具swingbench和sysbench对比
查看>>
MySQL源码安装总结(r12笔记第12天)
查看>>
花卉世界大观园和杂技之游
查看>>
在eclipse中配置MySQL源码环境(r12笔记第14天)
查看>>
Oracle数据误操作全面恢复实战(r11笔记第78天)
查看>>
MySQL中的double write(二)(r12笔记第17天)
查看>>