预计所需阅读时间:3分钟

这篇文章是根据Google开源项目风格指南总结而来,原文链接:https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_language_rules/,对于自己经常没注意的地方或者少接触的地方,会多写一点。

1、使用模块的全路径名来导入每个模块。

2、允许使用异常,但异常是跳出正常控制流来处理错误、异常的方式。尽量减少try/except块中的代码量。

3、避免使用全局变量,用类变量来代替。但也有一些例外:1.脚本的默认选项。2.模块级常量,例如:PI = 3.14159,常量应该全大写,用下划线连接。3.有时候用全局变量来缓存值或者作为函数返回值很有用。4.如果需要,全局变量应该仅在模块内部可用,并通过模块级的公共函数来访问。

4、鼓励使用嵌套/本地/内部类或函数。

5、简单的列表推导可以比其它的列表创建方法更加清晰简单。生成器表达式可以十分高效,因为它们避免了创建整个列表。

6、按需使用生成器。简化代码,因为每次调用时,局部变量和控制流的状态都会被保存。比起一次创建一系列值的函数,生成器使用的内存更少。

7、Lambda函数适用于单行函数。常用在map(), filter()之类的高阶函数。

8、条件表达式x=1 if condition else 2之类适用于单行函数。

9、默认参数值适用大部分情况,但不能是列表、字典之类的可变对象。

10、尽可能使用隐匿false,即if foo:, if not bar:之类。0,空字符串,空元组、列表、字典、集合视为False。永远不要用==将一个布尔量与false相比较。使用 if not x: 代替。如果你需要区分false和None,你应该用像 if not x and x is not None: 这样的语句。

11、优先使用Queue模块的 Queue 数据类型作为线程间的数据通信方式。另外,使用threading模块及其锁原语(locking primitives)。了解条件变量的合适使用方式,这样你就可以使用 threading.Condition 来取代低级别的锁了。

12、嵌套的Python函数可以引用外层函数中定义的变量,但是不能够对它们赋值。变量绑定的解析是使用词法作用域,也就是基于静态的程序文本。对一个块中的某个名称的任何赋值都会导致Python将对该名称的全部引用当做局部变量,甚至是赋值前的处理。如果碰到global声明,该名称就会被视作全局变量。