读几点记要
放假闲暇想写几行代码,心想反正时间充裕不如先看看《google python style guide》挑挑平时写代码时候的错,于是真的发现了数处习惯和知识的漏洞,特此记录。
1. default argument values python中定义函数可以个参数赋予默认值,默认值可以是字符串,数字,None,当然也可是list [] 或者 dict {}等。当默认值是上述后两者等可变对象(mutable object)的时候可能产生一些问题,这些潜在的问题是由于函数的加载的时候默认参数值会被初始化,而不是每次函数调用的时候。考虑如下代码:
#default arguments values def f(a, b=1): pass #调用 f(1) # b 缺省,使用默认值 1 f(1, b=2) # b 为 2
问题所在:
#default arguments values 是 [] 等可变对象时会产生一些潜在的问题 def f(a, l=[]): l.append(a) return l #调用 f(1) >>> [1] f(2) >>> [1, 2] f(3) >>> [1, 2, 3] #改成如下代码解决 def f(a, l=None): if not l: l = [] # ...
(此代码参照了 http://blog.****.net/delphiwcdj/article/details/5719470 )
2. 空格的使用(whitespace)
代码中适量的空格会是代码格式清晰,更加易读;但过量使用空格也会适得其反,使得阅读、维护成本增高。
2.1 "()", "{}", "[]" 中不要有空格:
Yes: spam(ham[1], {eggs: 2}, []) No: spam( ham[ 1 ], { eggs: 2 }, [ ] )
2.2 逗号(comma),分号(semicolon),冒号(colon)之前不要有空格,在这些符号的(前提是符号不在行末尾)后面可以有一个空格:
Yes: if a == b: print x, y No: if a == b : print x , y
2.3 函数调用、数组选取、dict选取的左括号前不要有空格:
Yes: spam(1) list[index] = dict['key'] No: spam (1) list [index] = dict ['key']
2.4 >, =, == 等操作符两侧最好有空格,但函数声明的default arguments value 和函数调用传递参数时 = 两侧不要有空格:
Yes: def f(a=1, b=2): pass f(a=3, b=4) No: def f(a = 1, b = 2): pass f(a = 3, b = 4)
2.5 在一行之内不要用空格控制竖直位置,以免增加维护成本:
Yes: class AaBb(Entity): a = Field(String(100), default='aa') # name b = Field(Integer(8)) #number No: class AaBb(Entity): a = Field(String(100), default='aa') # name b = Field(Integer(8)) #number
3 有关字符串的一些连接操作:
3.1 两个或几个字符串直接拼接的时候可以用 a + b,否则用'%s, %s.'%(a, b) 更妥;
3.2 循环体内字符串拼接的时候最好先将片段存入数组,再进行 join 拼接。这样可以减少不断的生成临时string 对象从而缩短运行时间。
4 TODO 注释:
没有代码可以一次性写到完美,很多实际情况也确实要求我们暂时只把事情做到80%,所以TODO注释是非常重要的。通过TODO注释可以告诉自己也告诉其他人这部分代码可能在未来某时需要怎么样的改进,以及为何采用现在的暂时性方法。
标准的格式主要为了便于搜索:
# TODO(Zeke): change this to use relations
最后的结束语看过之后也很有触动,为什么要做一份代码编写规范(协议)呢?我们应该怎样做呢?
1. 保持代码所在环境的风格。在已有代码中加入新代码的时候应该先去熟悉现有代码的风格,比如缩进、空格的使用,然后再加入自己的代码,以使得新代码的风格不会显得突兀,从而给阅读者造成困扰;
2. 代码编写规范的意义就在于使别人(或自己)阅读代码的时候专注于代码的内容是什么,而不是这段代码是怎么写的。团队协作尤其需要这些。
3. 最重要的一点:始终如一的坚持某一风格。
-eof-