参考:https://blog.csdn.net/dqchouyang/article/details/81714619?ops_request_misc=&request_id=&biz_id=102&utm_term=python%20脚本规范&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-81714619.pc_search_result_control_group&spm=1018.2226.3001.4187
为什么要有代码规范?
- 好的规范会形成好的编码风格,看着熟悉、亲切,心情好
- 增加可读性,易维护,提高工作效率
python代码规范
1.缩进
4个空格,在linux系统下体现比较明显,IDE会将Tab转成4个空格,放心使用
2.行的最大长度
每行代码的最长字符数不超过80个,一屏可以看完,不需要左右移动
3.空行
本页的一级类或者方法之间空2行,二级类和方法之间空1行
class A(object):
# 空1行
def __init__(self):
a = 1
# 空1行
class B(object):
b = 1
# 空1行
class C(object):
c = 1
# 空1行
def aa(self):
aa = self.B()
# 空1行
# 空1行
class B(object):
# 空1行
def __init__(self):
a = 1
# 空1行
# 空1行
def a():
return True
# 页尾空1行
4.类命名
大驼峰命名:所有单词的首字母都大写,并且不使用特殊字符、下划线和数字
# ✔️
class CodeStandard(object):
# ❌
class Code-Standard(object):
class Code_Standard(object):
class _CodeStandard(object):
class codeStandard(object):
class Codestandard(object):
class Codestandard2(object):
5.方法命名
全小写字符或者下划线,多单词用下划线连接,但下划线不能做首字母
# ✔️
def code_standard():
# ❌
def Code_standard():
def _codestandard(): # 內建函数,受保护
def __codestandard(): # 內建函数,受保护
def code__standard():
def codestandard():
6.常量命名
以大写字母开头,全部大写字母或下划线或数字,多见于项目的settings文件中
MAX_SIZE = 100
7.注释
单行注释:若注释独占一行,#号顶头,空1格后写注释;若是行尾注释,空2格后#号再空1格写注释
多行注释:三对双引号(推荐使用)和三对单引号
复杂逻辑一定要写注释,除非这个项目就你一个人管一辈子
# 代码注释
def code_standard(): # 代码注释
"""
A...
B...
"""
'''
A...
B...
'''
8.导入
每个文件头,都会有一些导入,导入顺序为:先导入python包,再导入第三方包,最后导入自定义的包。不使用的包不要导入,不要两个文件循环导入
import sys, os # python包,可导入多个
import pytz # 第三方包
from datetime import datetime # python包
from django.http import request, response # 第三方包
from mysite.test import Test # 自定义包
from mysite.test import * # 不要用 import * 的这种代码
9.空格
给变量赋值时,变量后空1个格,运算符或逗号后空1个格,作为参数时符号前后不空格
# ✔️
a = 1
a += 2
def b(num=0):
# ❌
a = 111 # 不要值都右对齐
b = 2
c = 23
10.try
代码中要尽量少的出现 异常捕获 的代码,有些临界值或极值你是可以预见的,如果没有预见,那就让代码报错,重新修改代码,这是一个好的方式,加多了异常捕获,反而会导致问题难以定位,劳心劳力,劳民伤财,编码的好心情就没了。异常也分好多种类型,可以根据不同的类型去做出相应的逻辑处理
# ❌
try:
a += 2
except Exception, e:
log.error(e) # 最讨厌这种,出错无法定位
11.全局变量名
没有特殊需求,不要使用全局变量,有时候自己怎么掉坑里了都不知道
global aa
12.变量和传参不要使用关键字
# ❌
len = 0
type = 'mysql'
id = 1
str = 'ffe'
def aa(type='mongo'):
13.方法的参数默认值中,不要有列表的默认值(参数传的是指针)
# ❌
def a(a, b=[]):
b.append(a)
return b
>>> a(1, b=list('a'))
['a', 1]
>>> a(2, b=list('a'))
['a', 2]
>>> a('a')
['a']
>>> a('b')
['a', 'b']
>>> a('c')
['a', 'b', 'c'] # 这就是经常说,为啥我的结果有以前的重复的数据,解决:方法头重新定义列表
14.方法的返回值
优先返回True或False,
其次是返回数据,但一定要保证返回的数据类型是一致的,别if里返回的是True,else里返回的是数据。很伤脑筋的。
项目示例规范
.
├── README.md # 项目说明
├── db.sqlite3 # sqlite文件数据库,一般采用关系型和非关系型数据库(没有此文件)
├── draw # 主项目目录(里面可建多app)
│ ├── __init__.py # 导入的根文件
│ ├── admin.py # 项目管理员配置看到的信息
│ ├── migrations # 数据库迁移脚本目录
│ │ ├── 0001_initial.py # 迁移脚本
│ │ └── __init__.py
│ ├── models.py # 数据建模,项目中最重要的东西
│ ├── settings.py # 项目的环境变量
│ ├── urls.py # 项目的路由,url的跳转(不要使用反射,url规范如下)
│ ├── views.py # 视图层,逻辑处理
│ └── wsgi.py # 项目服务的启动入口
├── manage.py # 项目命令的入口
├── media # 上传上来的媒体文件的存放位置
│ └── avatar # 分类目录
│ └── mac_bsk3xvr.png # 媒体文件(头像)
├── requirements.txt # 项目使用的环境包和版本
├── static # 项目使用的静态文件目录
│ ├── css # 样式文件目录
│ │ └── application.css # 样式文件
│ ├── img # 图片目录
│ │ ├── header_bg.jpg # 图片文件
│ │ ├── header_bg1.jpg
│ │ ├── header_bg_repeat.png
│ │ └── header_icons.png
│ └── js # 脚本目录
│ ├── application.js # 脚本目录
│ ├── jquery-1.8.0.min.js
│ └── rand.js
└── templates # html模板目录
└── index.html # html文件
url规范
优秀的URL是可以表达这个接口所实现的功能的
api/zoos/ #所有动物园
api/zoos/1/ #id为1的动物园
api/zoos/1/animals/ #id为1的动物园中的所有动物
python典型写法
a, b = (1, 2)
a, b = 1, 2
a, b = b, a
c = a if a > b else b
aa = [1,2,3,4,5]
c = [n for n in aa if a > 2] # 推导式
with open(a.txt) as f:
...
匿名函数-lambda
g = lambda s: s + ".fsh"
g("haha")
haha.fsh
高阶函数-filter、reduce、map
aa = ['a', 'b','c', 'd']
def fun1(s):
return s if s != 'a' else None
ret = filter(fun1, aa)
ret
['b', 'c', 'd']
修饰器-@