codecamp

Python 默认参数值规范 | Google 官方避坑指南

默认参数值

Tip

大部分情况下允许。

定义:

你可以为参数列表的最后几个参数赋予默认值,例如,def foo(a, b = 0):
如果调用foo时只带一个参数,则b为0。
如果调用时带两个参数,则b的值等于第二个参数。

优点:

很多时候,你需要一个拥有大量默认值的函数,并且偶尔需要覆盖这些默认值。
通过默认参数值可以轻松实现这种功能,不需要为了覆盖默认值而编写大量额外的函数。
同时,Python不支持重载方法和函数,而默认参数的写法可以轻松”仿造”重载行为。

缺点:

默认参数在模块被导入时求值且只计算一次。
如果值是列表和字典等可变类型,就可能引发问题。
如果函数修改了这个值(例如往列表内添加元素),默认值就变化了。

结论:

可以使用,不过有如下注意事项:
函数和方法的默认值不能是可变 (mutable) 对象。

正确

def foo(a, b=None):
    if b is None:
        b = []
def foo(a, b: Optional[Sequence] = None):
    if b is None:
        b = []
def foo(a, b: Sequence = ()):  # 允许空元组,因为元组是不可变的

错误


from absl import flags
_FOO = flags.DEFINE_string(...)


def foo(a, b=[]):
    ...
def foo(a, b=time.time()):  # 确定要用模块的导入时间吗???
    ...
def foo(a, b=_FOO.value):  # 此时还没有解析 sys.argv...
    ...
def foo(a, b: Mapping = {}):  # 可能会赋值给未经过静态检查 (unchecked) 的代码
    ...
```Google
Python 条件表达式规范 | Google 官方三目写法
Python 特性 (property) 规范 | Google 官方用法
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }