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 这几个字段

python 3.0 编码 python编码规范有哪些_Python

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规范文档地址