内容:
1、python 语言和风格规范
2、Autopep8 配置
3、参考资料
一、Python 语言规范
1、包、模块与导入
顺序:
标准库imports
相关第三方imports
本地应用/库的特定imports
推荐:
使用绝对路径导入
分行写,而不是写入同一行,例如:
#yes
import os
import sys
from subprocess import Popen, PIPE
#no
import os, sys
避免:
使用相对路径
使用通配符*,容易造成命名含义不清
2、异常使用
推荐:
1. 异常类应派生自Exception而不是BaseException
2.抛出异常时,用raise ValueError('message')代替raise ValueError, 'message'
3.尽量减少try/except块中的代码量
4.使用finally子句来执行那些无论try块中有没有异常都应该被执行的代码
5.捕获异常时,尽可能使用明确的异常,而不是用一个空的Except
3、列表生成式
推荐:
适用于简单情况. 每个部分应该单独置于一行
避免:
避免使用多重for语句, 复杂情况使用for循环
YES:`squares = [x * x for x in range(10)]
No:`result = [(x, y) for x in range(10) for y in range(5) if x * y > 10]
4、Lambda函数
推荐:
适用于单行函数. 如果代码超过60-80个字符, 最好还是定义成常规(嵌套)函数.
对于常见的操作符,例如乘法操作符,使用 operator 模块中的函数以代替lambda函数. 例如, 推荐使用 operator.mul , 而不是 lambda x, y: x * y .
5、条件表达式
推荐:
适用于单行函数. 在其他情况下,推荐使用完整的if语句.
6、if条件判断
1.避免将一个布尔值与True/Fasle 做等值判断,如果你需要区分false和None, 你应该用像 if not x and x is not None: 这样的语句.
2.避免与None做== 判断,应该采用is/is not
3.使用is not操作符而不是not ... is, 前面可读性更好
4.对于序列(字符串, 列表, 元组), 要注意空序列是false. 因此 if not seq: 或者 if seq: 比 if len(seq): 或 if not len(seq): 要更好.
5.注意‘0’(字符串)会被当做True.
NO:
if value1 == False
if value2 == None
if value3 is not None
YES:
if not value1
if value2 is None
if not values is None
7、默认参数
避免使用可变参数作为默认参数,如果函数修改了对象(例如向列表追加项), 默认值就被修改了
Yes:
def foo(a, b=None):
if b is None:
b = []
No:
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...
8、全局变量
避免使用全局变量, 用类变量来代替. 但也有一些例外:
脚本的默认选项.
模块级常量. 例如: PI = 3.14159. 常量应该全大写, 用下划线连接.
有时候用全局变量来缓存值或者作为函数返回值很有用.
如果需要, 全局变量应该仅在模块内部可用, 并通过模块级的公共函数来访问.
9、空格、空行、行长度、缩进
1.括号内不要有空格
2.不要在逗号, 分号, 冒号前面加空格, 但应该在它们后面加(除了在行尾).
3.参数列表, 索引或切片的左括号前不应加空格.
4.在二元操作符两边都加上一个空格, 比如赋值(=), 比较(==, <, >, !=, <>, <=, >=, in, not in, is, is not), 布尔(and, or, not).
5.当’=’用于指示关键字参数或默认参数值时, 不要在其两侧使用空格
6.使用2个空行来分隔最外层的函数(function)和类(class)定义,使用1个空行来分隔类中的方法(method)定义。
7.行长度不超过80字符
8.用4个空格来缩进代码
推荐:command+option+l 快捷键格式化代码,autopep8调整格式
注意:格式化时,注意格式化别人代码带来的影响
10、注释
1.块注释:块注释的每一行都应该以#和一个空格开头。块注释中的段落应该用只含有单个#的一行隔开。
2.行内注释:尽量少用行内注释。行内注释是和代码语句写在一行内的注释。行内注释应该至少和代码语句之间有两个空格的间隔,并且以#和一个空格开始。
3.文档字符串:所有的公共模块,函数,类和方法都应该有文档字符串。详细规则:https://www.python.org/dev/peps/pep-0257/
4.多行文档字符串以单行"""结尾,不能有其他字符
"""Return a foobang
Optional plotz says to frobnicate the bizbaz first.
"""
5. 对于仅有一行的文档字符串,结尾处的"""应该也写在这一行
6. TODO注释:开头处包含”TODO”字符串, 紧跟着是用括号括起来的你的名字, email地址或其它标识符. 然后是一个可选的冒号. 接着必须有一行注释, 解释要做什么.
# TODO(kl@gmail.com): Use a "*" here for string repetition.
# TODO(Zeke) Change this to use relations.
11、命名
Python之父Guido推荐的规范
12、文件和sockets
在文件和sockets结束时, 显式的关闭它.
推荐:
使用“with”语句以管理文件:
with open("hello.txt") as hello_file:
for line in hello_file:
print line
二、pycharm配置autopep8
1、安装autopep8
pip install autopep8
2、选择菜单「Pycharm」–>「Preferences」–>「Tools」–>「External Tools」–>点击加号添加工具
3、填写如下配置项,点击「OK」保存
Name:Autopep8 (可随意填写)
Tools settings:
Programs:autopep8
Parameters:--in-place --aggressive --ignore=E123,E133,E50 $FilePath$
Working directory:$ProjectFileDir$
4、选择菜单「Tool」–>「Extern Tools」–>「Autopep8」即可使用autopep8自动格式化你的python代码了
三、参考资料
https://google.github.io/styleguide/pyguide.html