python 代码规范
(一)、代码编码:
1、国际惯例,文件编码和 Python 编码格式全部为 utf-8 ,例如:在 Python 代码的开头,要统一加上 # -- coding: utf-8 --。
2、Python 代码中,非 ascii 字符的字符串,请需添加u前缀
3、若出现 Python编 码问题,可按照以下操作尝试解决:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
**
(二)、命名规范:
2.1、模块
模块尽量使用小写命名,首字母保持小写,尽量不要用下划线(除非多个单词,且数量不多的情况)
# 正确的模块名
import decoder
import html_parser
# 不推荐的模块名
import Decoder
2.2、类名
类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头
class Farm():
pass
class AnimalFarm(Farm):
pass
class _PrivateFarm(Farm): # 私有
pass
2.3、函数
函数名一律小写,如有多个单词,用下划线隔开
def run():
pass
def run_with_env():
pass
注:私有函数在函数前加一个下划线_
class Person():
def _private_func():
pass
2.4、变量名
变量名尽量小写, 如有多个单词,用下划线隔开
if __name__ == '__main__':
count = 0
school_name = ''
2.5、常量
常量采用全大写,如有多个单词,使用下划线隔开。
MAX_CLIENT = 100
MAX_CONNECTION = 1000
CONNECTION_TIMEOUT = 600
注:
变量名、类名取名必须有意义,严禁用单字母
变量名不要用系统关键字,如 dir type str等等
建议:
bool变量一般加上前缀 is_ 如:is_success
(三)、代码格式
3.1 import 顺序:
1、标准库
2、第三方库
3、项目本身
例如:
# 正确的写法
import os
import sys
# 不推荐的写法
import sys,os
# 正确的写法
from foo.bar import Bar
# 不推荐的写法
from ..bar import Bar
(注:每一行只导入一个库,不要用(,)多个引入。 并且各import类型之间需要用空行隔开)
3.2 关于空行
模块级函数和类定义之间空两行;类成员函数之间空一行;
class A:
def __init__(self):
pass
def hello(self):
pass
def main():
pass
3.3 关于空格
3.3.1在二元运算符两边各空一格[=,-,+=,==,>,in,is not, and]:
# 正确的写法
i = i + 1
submitted += 1
x = x * 2 - 1
hypot2 = x * x + y * y
c = (a + b) * (a - b)
# 不推荐的写法
i=i+1
submitted +=1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)
3.3.2函数的参数列表中,,之后要有空格
# 正确的写法
def complex(real, imag):
pass
# 不推荐的写法
def complex(real,imag):
pass
3.3.3 函数的参数列表中,默认值等号两边不要添加空格
# 正确的写法
def complex(real, imag=0.0):
pass
# 不推荐的写法
def complex(real, imag = 0.0):
pass
3.3.4 左括号之后,右括号之前不要加多余的空格
# 正确的写法
spam(ham[1], {eggs: 2})
# 不推荐的写法
spam( ham[1], { eggs : 2 } )
3.3.5 字典对象的左括号之前不要多余的空格
# 正确的写法
dict['key'] = list[index]
# 不推荐的写法
dict ['key'] = list [index]
3.3.6 不要为对齐赋值语句而使用的额外空格
# 正确的写法
x = 1
y = 2
long_variable = 3
# 不推荐的写法
x = 1
y = 2
long_variable = 3
(四)、models 内部定义顺序:
1. All database fields
2. Custom manager attributes
3. class Meta
4. def (str)
5. def save()
6. def get_absolute_url()
7. Any custom methods
(五)、异常捕获处理原则:
尽量只包含容易出错的位置,不要把整个函数 try except
对于不会出现问题的代码,就不要再用 try except了
只捕获有意义,能显示处理的异常
能通过代码逻辑处理的部分,就不要用 try except
异常忽略,一般情况下异常需要被捕获并处理,但有些情况下异常可被忽略,只需要用 log 记录即可,可参考一下代码:
def ignored():
try:
yield
except Exceptions as e:
logger.warning(e)
pass
(六)、使用数字、常量表示状态
两种的话改为 true/false,多种改为 enum 可读性更好
def enum(**enums):
return type("Enum", (), enums)
StatusEnum = enum(
SUCCESS=True,
FAIL=False,
)
(七)、RestfulApi 接口规范:
7.1 HTTP请求方式
对于资源的具体操作类型,由HTTP动词表示。常用的HTTP动词有下面四个(括号里是对应的SQL命令)。
GET(SELECT):从服务器取出资源(一项或多项)
POST(CREATE):在服务器新建一个资源。
PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)
DELETE(DELETE):从服务器删除资源
实际举例如下:
GET /product:列出所有商品
POST /product:新建一个商品
GET /product/ID:获取某个指定商品的信息
PUT /product/ID:更新某个指定商品的信息
DELETE /product/ID:删除某个商品
GET /product/ID/purchase :列出某个指定商品的所有投资者
get /product/ID/purchase/ID:获取某个指定商品的指定投资者信息
7.2 接口返回内容
接口返回内容开发建议直接参考蓝鲸 apigateway 规范,返回的内容中包含 result code data message request_id 这几个字段
7.3接口返回Status Code
**建议充分利用 HTTP Status Code 作为响应结果的基本状态码,基本状态码不能区分的 status,
再用响应 body 中"约定"的 code 进行补充
http状态码详细说明请参考:https://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81/5053660
常用状态码如下:
200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
(八 )、Python 代码注释
8.1 单行注释(行注释)
- 以
#
开头,#
右边的所有东西都被当做说明文字,而不是真正要执行的程序,只起到辅助说明作用 - 示例代码如下:
# 这是第一个单行注释
print("hello python")
print("hello python") # 输出 `hello python`
注:如在代码后面注释,为了保证代码的可读性,注释和代码之间至少要有两个空格
8.2 多行注释
- 如果希望编写的 注释信息很多,一行无法显示,就可以使用多行注释
- 要在 Python 程序中使用多行注释,可以用 一对 连续的 三个 引号(单引号和双引号都可以)
- 示例代码如下:
"""
这是一个多行注释
在多行注释之间,可以写很多很多的内容……
"""
print("hello python")
(九)、其他注意问题
1、【必须】去除代码中的 print,否则导致正式和测试环境 uwsgi 输出大量信息
2、逻辑块空行分隔
3、变量和其使用尽量放到一起
4、【必须】 import过长,要放在多行的时候,使用 from xxx import(a, b, c),不要用 \ 换行
5、Django Model 定义的 choices 直接在定义在类里面
关于代码规范
-
Python
官方提供有一系列 PEP(Python Enhancement Proposals) 文档 - PEP 8规范文档地址