前言
之前一直使用sublime编辑器编写python代码,后面使用vs code编辑器打开项目文件时,发现有很多规范上的问题。特地总结一下编写python代码规范,编写代码时还是需要严格遵守代码规范。
参考
若需要阅读Google官方python代码风格指导文档,请点击这里。
对于以下文档中没有提到规范,你可以使用python模块pylint检查你的python代码是否符合规范。
1 | pip3 install pylint |
在这里推荐使用VS code编辑器,安装pylint后。打开你的项目文件,查看是否存在代码规范问题。
代码规范
编码
无特殊情况,代码文件一律使用utf-8编码
无特殊情况,代码文件头部必须加入 # -- coding: utf-8 --
1
# -*- coding: utf-8 -*-
代码格式
- 缩进:一律使用4个空格缩进。禁止空格和tab键混合使用,否则会报错。
- 行宽:每行代码尽量不超过80个字符,最长不得超过120个字符。
- 引号:自然语言使用双引号,也可以使用unicode,如u”错误”。机器标识语言使用单引号 ‘ ‘,如dict中key值。正则表达式使用原生双引号,如r“…”。文档字符串使用三个双引号,如”””….”””。
import语句
import语句需分行书写。
1
2
3
4
5
6
7# 正确的写法
import sys
import time
from subprocess import Popen, PIPE
# 不推荐的写法
import sys, timeimport语句需使用绝对导入(absolute import)。
1
2
3
4
5# 正确的写法
from foo.bar import Bar
# 不推荐的写法
from ..bar import Barimport语句应该放在文件头部,置于模块说明及docstring之后,于全局变量之前。
1
2
3
4
5# -*- coding: utf-8 -*-
"""
This is a Test program
"""
import sysimport语句应该按照顺序排列,每组之间用一个空行分隔。
1
2
3
4
5
6# 以flask库的wrappers.py文件为例,以下为该文件导入的包
from werkzeug.exceptions import BadRequest
from werkzeug.wrappers import Request as RequestBase, Response as ResponseBase
from flask import json
from flask.globals import current_app如果你的代码里没有使用到该模块,就不需要用import导入。
1
2
3
4
5import xlrd
# 代码不需要xlrd库,不需要写以上import xlrd代码
def test():
pass
空格
在二元运算符两边各空一格
[=,-,+=,==,>,in,is not, and]
:1
2
3
4
5
6# 正确的写法
i = i + 1
submitted += 1
x = x * 2 - 1
hypot2 = x * x + y * y
c = (a + b) * (a - b)函数的参数列表中,
,
之后要有空格1
2
3# 正确的写法
def plus_func(a, b):
pass函数的参数列表中,默认值等号两边不要添加空格
1
2
3# 正确写法
def plus_func(a=1, b):
pass左括号之后,右括号之前不要加多余的空格
1
2
3
4
5# 正确的写法
spam(ham[1], {eggs: 2})
# 不推荐的写法
spam( ham[1], { eggs : 2 } )字典对象的左括号之前不要多余的空格
1
2
3
4
5# 正确的写法
dict['key'] = list[index]
# 不推荐的写法
dict ['key'] = list [index]不要为对齐赋值语句而使用的额外空格
1
2
3
4
5
6
7
8# 正确的写法
a = 1
b = 33
name = 'test'
# 不正确的写法
a = 1
b = 33
name = 'test'
换行
python支持括号内的换行。
docstring规范
docstring中文可称为文档字符串。python独有的一种注释方式。通过这样注释的字符串能够被对象的__doc__方法自动获取。
所有的公共模块、函数、类、方法,都必须写 docstring 。私有方法不一定需要,但应该在 def 后提供一个块注释来说明。
docstring 的结束”””应该独占一行,除非此 docstring 只有一行。
1
2
3
4
5
6
7# docstring写在如下位置
class Test():
"""class Test
"""
def func():
"""func"""
pass
文件处理规范
推荐使用 “with”语句处理文件
1 | # 推荐用法 |
命名规范
模块名,module。全部小写,单词之间用下划线分隔。
1
main.py
包名,package。全部小写,单词之间用下划线分隔。
1
flask
类名,class。首字母大写,驼峰式命名。
1
class WinMain:
全局变量(常量),global variables。全部大写,单词之间用下划线分隔。
1
PERSON_NAME = "Fan"
变量,variables。这里默认为public类型的变量。变量名尽量小写, 如有多个单词,用下划线隔开。
1
2name = ''
your_name = 'Alan'实例变量,以一个下划线_开头,如有多个单词,用下划线隔开。
用单下划线(_)开头表示模块变量或函数是protected的(使用import * from时不会包含).
1
self._your_name = ''
内置变量(专有变量)。这类变量一般不用我们定义。以两个下划线__开头,两个下划线结尾
1
__name__ = ''
用双下划线(__)开头的实例变量或方法表示为私有变量或私有方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class Test():
"""Test"""
# protected型变量
_name = 'protected variable'
# 私有private变量
__info = 'private variable'
def _func1():
"""protected"""
print("这是一个protected方法")
def __func2():
"""private私有"""
print("这是一个private方法")
def print_func():
"""public公共"""
print('这个一个public方法')函数方法,function/method。全部小写,单词之间用下划线分隔。
1
def test_method():
标志位,以has或is,下划线分隔单词命名
1
2is_true = True
has_name = True
注释规范
行注释
“#”号后空一格。
1
2
3# 推荐的写法
def test():
print('行注释') # 打印块注释
如下所示,也是用”#”。
1
2
3
4
5# 块注释
# 块注释
#
# 块注释
# 块注释在关键代码部分可以使用更加项目的注释
1
2
3
4
5
6
7
8app = create_app(name, options)
# =============================
# 请不要修改此部分的代码
# =============================
if __name__ == "__main__":
app.run文档注释(docstring)
作为文档的Docstring一般出现在模块头部、函数和类的头部,这样在python中可以通过对象的__doc__获取文档信息。编辑器和IDE也可以根据Docstring给出自动提示。
文档注释以 “”” 开头和结尾, 首行不换行, 如有多行, 末行必需换行。以下为文件头部的docstring。
1
2
3
4
5
6
7
8
9
10# -*- coding: utf-8 -*-
"""Example docstring
flask.app
~~~~~~~~~
This module implements the central WSGI application object.
:copyright: © 2010 by the Pallets team.
:license: BSD, see LICENSE for more details.
"""类和函数的头部定义的docstring。具体描述其具体内容以及实现的功能,解释具体参数和返回值等。
1
2
3
4
5
6
7
8
9class WinMain(QtGui.QMainWindow):
"""程序主窗口类,主要实现生成ui界面。
另外包括
"""
def init_config(self):
"""初始化工具程序界面的配置参数,
没有返回值
"""
pass