webapi 设置参数可为空_Python开发中关于参数使用的几点建议 -- 3

使用None和文本字符串来指定动态默认参数(Use None and Docstrings to Specify Dynamic Default Arguments)。

有些时候可能需要使用非静态类型作为关键字参数的默认值,比如你想在打印日志的时候同时输出日志事件发生的时间。默认情况下,你想记录方法被调用的时间,没准你就直接写下了下面的代码,你可能会认为每次调用的时候都会重新更新默认参数值:

9c1e8aeb227aa3b6fda0cff4972da281.png

但是实际上,所有输出的时间都是一样的,这个时间就是方法被定义时的时间。参数的默认值只会在模块被加载时执行一次,这通常会发生在程序启动的时候。一旦包含这类方法的代码被加载了,所有像datetime.now的参数就不会再被计算了。

在Python中想要实现这种功能的惯例是给默认参数赋值为None,同时在docstring中说明如何处理这种None值。而在你的方法体中,一旦发现默认参数值是None就为它赋予期望值。据此修改上面代码如下:

33c5ab712de9fa390db1d7cc0dc75dcf.png

此时输出的时间戳就已经是正确的了:

6e23579b99ad73aa75c5c4b4df3ae057.png

使用None作为那些经常发生变化的参数的默认值非常重要。例如,你写了一个方法用来加载JSON文件,如果加载失败你希望返回一个空字典,代码可以写成下面的样子:

43811112bbf5e3ce2695b654cb183a41.png

此时出现的问题就像前面提到的datetime.now一样,所有调用这个方法失败是返回的空字典都是一个,也就是说它们的返回值是共享的。这就会产生很多奇怪的问题:

8a8692c7c36391bb358af2fd852d474f.png

本来你希望这两次方法调用能产生两个不同的返回值,每一个返回值都有自己的key和value。但是实际上,对一个返回值的修改也会修改另一个返回值。出现这种错误的罪魁祸首就是返回值Foo和Bar其实都是参数的默认值,即同一个字典对象。

287de3e0e2f7a9c47f7cfc8f34ef2cd4.png

解决办法就是将参数的默认值设置成None,同时在docstring中详细写明方法提如何处理默认参数的:

6e836bddb5cb0bf064745b29a2d32005.png

此时再去调用这个方法时就不会出现任何异常了:

19afb3e715cbc3ea46f6b60a1aa670c1.png

总结

  • 默认参数只会被赋值一次:在方法声明时所在的模块被加载时。这回产生很多奇怪的问题(例如:{}和[]).
  • 对于那些拥有动态参数值的参数,使用None作为默认值,在方法的文档说明中详细介绍参数默认值的行为。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值