模块

将相关的类和顶级函数放在同一个模块里1

导入2

全局变量5

列表推导/生成器表达式6

正例:

result = []
for x in range(10):
  for y in range(5):
      if x * y > 10:
          result.append((x, y))

for x in xrange(5):
  for y in xrange(5):
      if x != y:
          for z in xrange(5):
              if y != z:
                  yield (x, y, z)

return ((x, complicated_transform(x))
      for x in long_generator_function(parameter)
      if x is not None)

squares = [x * x for x in range(10)]

eat(jelly_bean for jelly_bean in jelly_beans
  if jelly_bean.color == 'black')

反例:

result = [(x, y) for x in range(10) for y in range(5) if x * y > 10]

return ((x, y, z)
      for x in xrange(5)
      for y in xrange(5)
      if x != y
      for z in xrange(5)
      if y != z)

函数和方法

允许使用嵌套/本地/内部函数7

方法和函数内部可再次定义函数。

Lambda 函数8

函数或方法参数默认值9

不使用可变对象作为函数或方法的参数默认值。

正例:

def foo(a, b=None):
    if b is None:
        b = []

反例:

def foo(a, b=[]):
    ...
def foo(a, b=time.time()):  # The time the module was loaded???
    ...
def foo(a, b=FLAGS.my_thing):  # sys.argv has not yet been parsed...
    ...

返回语句一致性10

在函数或方法中,返回语句要么都返回某表达式,要么都不返回。

正例:

def foo(x):
    if x >= 0:
        return math.sqrt(x)
    else:
        return None

def bar(x):
    if x < 0:
        return None
    return math.sqrt(x)

反例:

def foo(x):
    if x >= 0:
        return math.sqrt(x)

def bar(x):
    if x < 0:
        return
    return math.sqrt(x)

装饰器11

避免装饰器的外部依赖(即不要依赖文件、sockets、数据库连接等),因为装饰器运行时这些资源可能不可用。应该保证有效参数调用的装饰器在任何情况下都可成功。

允许使用嵌套/本地/内部类7

属性12

类型比较10

对象的类型比较应始终使用 isinstance() 而非直接比较类型。

正例:

if isinstance(obj, int):

反例:

if type(obj) is type(1):

排序10

When implementing ordering operations with rich comparisons, it is best to implement all six operations ( __eq__, __ne__, __lt__, __le__, __gt__, __ge__ ) rather than relying on other code to only exercise a particular comparison.

To minimize the effort involved, the functools.total_ordering() decorator provides a tool to generate missing comparison methods.

PEP 207 indicates that reflexivity rules are assumed by Python. Thus, the interpreter may swap y > x with x < y , y >= x with x <= y , and may swap the arguments of x == y and x != y . The sort() and min() operations are guaranteed to use the < operator and the max() function uses the > operator. However, it is best to implement all six operations so that confusion doesn’t arise in other contexts.

异常10

布尔判断

条件表达式18

适用于单行情况(one-liners)比如 x = 1 if cond else 2,其他情形使用完整的 if 语句。

文件和 sockets19

字符串20

其他

不要编写仅适用于特定 Python 实现的代码10

比如字符串连接语句 a += ba = a + b 的优化甚至在 CPython 中的支持也不够好,因此使用 ''.join() 是更通用的方式。

不要依赖内建类型的原子性21

优先使用 Queue 模块的 Queue 类型作为线程间的数据通信方式。另外,使用 threading 模块及其锁原语(locking primitives)。正确使用条件变量从而以 threading.Condition 取代低级锁。

避免使用威力过大的特性22

比如: