缺点: 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 来取代低级别的锁了。

相关文章: