一.为什么要有编码规范
规范的代码给人的第一感觉是【美观】,美的东西总是更加的吸引人,也愿意观看。不规范的代码风格总是令人感到难受,检查会很困难。
所以美观带来的是代码的【可读性】强,想一想你写的代码可读性非常高,是不是检查起来容易,维护起来也更加容易,所以可读性强带来
的是代码的【可维护性】强。最终你的代码【健壮性】高,不容易出BUG,即使出了也较容易解决。代码绝不是只要运行成功就可以了,从长
远看,一定是易于维护的代码,才是对整个项目是最有利的代码。编写规范的代码是程序员必须养成的习惯。
二.代码编排
- 缩进4个空格,禁止空格与Tab混用
- 每行最大长度80字符,换行可以使用反斜杠,最好使用圆括号。换行点要在操作符的后边敲回车,防止单行国语复杂的import
- 不使用 from xxx import * 这种语法
- 类和top-level函数定义之间空两行;类中的方法定义之间空一行;函数内逻辑无关段落之间空一行;其他地方尽量不要再空行。
三.文档编排
1.顺序
模块内容的顺序:模块说明和docstring—import—globals&constants—其他定义。
其中import部分,又按标准、三方和自己编写顺序依次排放,之间空一行。
1. 单行不要 import 多个库
第一层:标准库
第二层:第三方库
第三层:自定义库
2. 模块内用不到的不要去 import
import os
import sys
from django.conf import settings
from django.core import xxx
from user.models import User
from user.models import Perm
2.冲突
如果采用from XX import XX引用库,可以省略‘module.’,都是可能出现命名冲突,这时就要采用import XX
from myclass import MyClass
from foo.bar.yourclass import YourClass
# 如果和本地名字有冲突:
import myclass
import foo.bar.yourclass
四.空格及空行的使用
1.空格
- 问号和逗号后面跟一个空格,前面无空格。
- 二元操作符前后各一个空格,包括以下几类:
- 数学运算符 + - * / // = & |
- 比较运算符 == != > < >= <= is not in
- 逻辑运算符 and or not
- 位运算符 & | ^ << >>
- 当=用于只是关键字参数或默认参数值时,不要在其两侧使用空格(函数默认参数使用的赋值符左右省略空格。)
2.空行
- 函数间:顶级函数间空2行,类的方法之间空1行
- 函数内:同一函数内逻辑块之间,空一行
- 文件结尾:留一个空行
- if/for/while语句中,即使执行语句只有一句,也必须另起一行。
五.注释
- 两点需要避免:①逐行添加注释②没有一个注释
- 行尾注释:单行逻辑过于复杂时添加
- 块注释:一段逻辑开始时添加
- 引入外来算法或者配置时须在注释中添加源连接,标明出处
- 函数、类、模块尽可能添加docstring
六.命名
- 好的变量名 要能做到"词能达意"
- 除非在lambda函数中,否则不要使用单字母的变量名(即使是lambda函数中的变量名也要尽可能的有意义)
- 包名、模块名、函数名、方法、普通变量名全部使用小写, 单词间用下划线连接
- 类名、异常名使用 CapWords (首字母大写) 的方式, 异常名结尾加
Error
或 Wraning
后缀
- 全局变量尽量使用大写, 一组同类型的全局变量要加上统一前缀, 单词用下划线连接
- 函数名必须有动词, 最好是 do_something 的句式, 或者 somebody_do_something 句式
- 类的方法第一个参数必须是self,而静态方法第一个参数必须是cls。
- mixedCase(混合大小写,第一个单词是小写)
七.常见的编码建议
1. 自定义的变量名、函数名不要与标准库中的名字冲突(我干过)
2. cpython中join效率比较"+",效率高
3. 尽可能使用‘is’‘is not’取代‘==’,比如if x is not None 要优于if x。
4. 使用startswith() and endswith()代替切片进行序列前缀或后缀的检查。比如
if foo.startswith('bar'):优于
if foo[:3] == 'bar':
5. 使用isinstance()比较对象的类型。比如
if isinstance(obj, int): 优于
if type(obj) is type(1):
6. 判断序列空或不空,有如下规则
if not seq:
if seq: 这两种由于判断他们的长度值
7. 字符串不要以空格收尾。
8. 二进制数据判断使用 if boolvalue的方式。
9. 使用基于类的异常,每个模块或包都有自己的异常类,此异常类继承自Exception。
异常中不要使用裸露的except,except后跟具体的exceptions。
异常中try的代码尽可能少