缺点: pylint不完美,要利用其优势,我们有时候需要 a)围绕着它来写代码 b) 抑制其告警 c)改进它 d)忽略它
使用 from x import y as z,如果连个要导入的模块都叫做y或者y太长了
结论:所有的新代码都应该用完整包名来导入每个模块,即如下:
#reference in code with complete name import sound.effects.echo #reference in code with just module name(preferred) from sound.effects import echo #这样就可以在程序中使用echo,而非 sound.effects.echo 全名来访问模块echo 使用模块的全路径名,比如 import sound.effects.echo 而非相对路径,比如 import sound import sound.effect import echo
(2)模块或包应该定义自己的特定于的异常基类,这个基类应该从内建的Exception类继承,模块的异常基类应该叫做Error.
class Error(Exception):
pass
(6)当捕获异常时,使用as而不要用逗号,例如
try:
raise Error
except Error as e:
pass
避免使用模块变量,使用类变量来代替。
缺点:嵌套类或局部类的示例不能被序列化
因此,适用于简单的情况。每个部分应该单独置于一行:映射表达式,for语句,过滤器表达式,禁止多重for语句或过滤器表达式。复杂情况下还是使用for循环。
比如:
for key in adict
if key not in adict
if obj in alist
for line in afile
for k, v in dict.iteritems()
优点:简化代码,因为每次调用时,局部变量和控制流的状态都会被保存,比起一次创建一系列之的函数,生成器使用的内存小。
lambda表达式很方便,但是比本地函数更难阅读和调试,没有函数名意味着堆栈跟踪更难理解。由于lambda函数通常只包含一个表达式,因此其表达能力有限。
x = 1 if cond else 2
访问和设置数据成员时,建议使用属性@property来代替轻量级的访问和设置函数。
使用python布尔值的条件语句更易读也不易出错,大部分情况下也更快。比如
应该:
if not x:
print 'x is an empty list'
不应该:
if x == []:
print 'x is an empty list'
(6)注意'0'(字符串)会被当做true
尽可能使用字符串方法取代字符串模块,使用函数调用语法取代apply(),使用列表推导,for循环取代 filter(), map(), reduce().
嵌套的python函数可以引用外层函数中定义的变量,但是不能对它们进行赋值。变量绑定的解析是使用词法作用域,也就是基于静态的程序文本。对一个块中的某个名称的任何赋值都会导致python将对该名称的全部引用当做局部变量,甚至是赋值前的处理。如果碰到global声明,该名称就会被视作全局变量。
i = 4
def foo(x):
def bar():
print i
#....
#a bunch of code
#....
for i in x:
print i
bar()
foo([1,2,3])
结果输出 1 2 3 3, 而不是 1 2 3 4
x是一个列表,for循环将x中的值依次赋给i,这样对i的赋值就隐式的发生了,
整个foo函数体中的i都会被当做局部变量,包括bar()中的那一个
因为 在foo函数中,执行完 for 循环之后,i变量被赋值了,此时执行bar(),i变量仍然为刚刚的那个值。
优先使用Queue模块的Queue数据类型作为线程间数据通信方式,另外使用threading模块机器锁原语。了解条件变量的合适使用方式,这样就可以使用threading.Condition 来取代低级别的锁了。