作者tiefblau (tiefblau)
看板Python
标题[翻译] Google 建议的 Python 风格指南 12
时间Tue May 7 15:03:49 2013
原文网址:
http://google-styleguide.googlecode.com/svn/trunk/pyguide.html
* Default Argument Values
用於大部分情况
释义:
可以预先指定在在函数参数列尾端的变数数值。
def foo(a, b=0):
当仅用一个引数呼叫foo时,b会被设为0;
当使用两个引数呼叫foo时,b会为第二个引数。
优点:
我们经常使用含有许多预设值的函式,但只在极少情况下会需要覆盖它,
Default Argument Values提供一个简便的方式达到此目的,而不需要为了少见的例外定义
额外的函式。另外,Python并没有支援重载methods/function,预设参数值是一个"假装"
为重载行为的好方法。
缺点:
导入模组时,Default Argument Values仅会被定义一次,当参数是可变动的变数型态
如:list、dictionary时,如果该函式变动了该变数 (e.g. apped()到list),会改动到预
设的物件,造成问题。
决策:
注意以下警告使用。
1.定义函式时,不要用可变动的物件为预设参数值(Default Argument Values)。
正确:
def foo(a, b=None):
if b is None:
b = []
错误:
def foo(a, b=[]):
...
2.永远使用明确名字呼叫有预设值的参数,会帮助document the code,
当有更多参数加入时,也可帮助避免与侦测interface breakage。
//不太会翻这两句...
def foo (a,b=1):
...
正确
foo(1)
foo(1, b=2)
错误:
foo(1,2)
===
觉得很不错的指南,我也来献丑翻译一下,有哪边不对或是不通顺之处欢迎提出并请多多
包涵啦。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 101.12.133.136
1F:推 os653:请问为什麽不要用可变动的物件为预设参数值?理解力低不懂.. 05/07 15:53
举个例子
//其实我也没碰过,是另外去google
code:
def foo(a,b=[]):
b.append(a);
return b;
print foo(1)
print foo(2)
output:
[1]
[1,2]
但是通常我们要的效果是,每次call foo()时会有新的list。
所以建议改成决策1的绿色部分,if b is None 再给b一个新的list
3F:→ kilfu0701:可以看第五点 有范例程式 05/07 16:09
感谢k大提供
※ 编辑: tiefblau 来自: 101.10.69.64 (05/07 16:13)
4F:推 os653:感谢说明,如果发生了还真不好找原因 05/07 16:33
5F:推 darkgerm:因为预设参数值是在"定义时"就配好资源 05/07 17:13
6F:→ darkgerm:不是"执行时",所以上面那个范例在没给 b 时 b 都是指向 05/07 17:14
7F:→ darkgerm:同一个 list 05/07 17:14
8F:推 hilorrk:这还真是第一次看到,感谢! 05/07 17:31
9F:推 timTan:这是python 的雷了,一不注意就会因为这件事出bug~ 05/07 17:42
10F:推 ya790206:这个雷我同事之前遇过,只能说python对预设参数的处理与 05/07 20:41
11F:→ ya790206:其他语言不同,c++ 和 ruby 都没这个雷。 java, golang没 05/07 20:41
12F:→ ya790206:预设参数,无法比较 05/07 20:42
13F:推 sandwichC:推! 05/07 21:24
14F:推 waitriver:thanks 05/08 00:09