编写高质量Python代码的59个有效方法 第20条:用None来描述具有动态默认参数

先上代码:

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

log('hello once')
time.sleep(2)
log('hello twice')
>>>
hello once 2018-09-19 20:47:35.700265
hello twice 2018-09-19 20:47:35.700265
[Finished in 2.2s]

解释:
参数的默认值,会在每个模块加载进来时求出,而很多模块都是在程序启动时加载的。包含这段代码的模块一旦加载进来,参数的默认值就固定了。解决方法如题所示:

import datetime, time
def log(message, when=None):
    if when == None:
        when = datetime.datetime.now()
    print(message, when)

log('hello once')
time.sleep(2)
log('hello twice')
>>>
hello once 2018-09-20 14:16:28.560857
hello twice 2018-09-20 14:16:30.561830
[Finished in 2.2s]

要点

  • 对于以动态值作为默认值的关键字参数来说,应把形式上的默认值写为None,并在函数的文档字符串里面描述。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,958评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,405评论 25 708
  • 今天起床后,做了粥,炒了涨蛋,蒸了炖蛋,煮了蛋,还炒了个莴笋。对于三十年如一日,习惯了饭来张口的我来说,已经非常难...
    三河散人阅读 235评论 0 1