Python代码规范

Python已经成为了越来越热门的编程语言。其由于自身的简单易学的特性收到了很多人的喜爱。不过作为一门脚本语言,Python也有着自己的代码规范。符合规范的使用Python代码,不仅可以提升代码的易读性,维护起来也更加方便。下面就让我们来看看吧。

下面的内容均以Python 3版本为基础。Python已经结束了对2.x版本的支持,建议使用3.x版本学习

基础概述

编码

  • 如无特殊情况,文件一律使用UTF-8编码,可以在IDE中自行设置

代码格式

缩进

  • 统一使用4个空格进行缩进。不要使用Tab,如果是IDE可以将Tab软设置成4个空格。

行宽

每行代码最好不超过80个字符,这样可以:

  • 查看diff时很有帮助

  • 方便控制台下看代码

引号

自然语言使用双引号,机器标示使用单引号

  • 自然语言使用双引号 “”,比如字符串"你好吗?"

  • 机器标示使用单引号,比如 dict['key'],这里的key不是一个自然语言,而是一个机器标示。对于字符和字符串而言,需要区分标示和自然语言。大多是情况下,都是机器标示,一句有意义的话才是自然语言,常用来做一些交互

  • 文档字符串用三个双引号 “””…”””

空行

  • 模块级函数与类定义之间空两行

  • 类成员函数之间空一行

  • 函数内部不同的功能区空一行,最好在功能区之前用注释标明所做的功能

class A:

  def __init__(self):
    pass

  def hello(self):
    pass


def main():
  pass

Import

  • import语句应该分行书写
# Correct
import os
import sys
from subprocess import Popen, PIPE

# Not recommended
import sys, os
  • import语句要使用绝对路径
# Correct
from foo.bar import Bar

# Not recommended
from ..bar import Bar
  • import语句应该放在文件头部,至于模块说明和docstring之后,全局变量之前

  • import语句应该按照顺序排列,每组之间用一个空行分离

import os
import sys

import msgpack
import zmq

import foo
  • 导入其他模块的类定义时,可以使用相对导入

  • 如果发生命名冲突,可以使用命名空间

空格

  • 在二元运算符两边各空一格[=,-,+=,==,>,in,is not, and]
# Correct
i = i + 1
submitted += 1
x = x * 2 - 1
x = (a + b) * (a - b)

# Not recommended
i=i+1
submitted +=1
x = x*2 -1
  • 函数的参数列表中的“,:”之后要有空格,之前不需要
# Correct
def complex(real, imag):
  pass

# Not recommended
def complex( real,imag):
  pass
  • 函数的参数列表中,默认值等号两边不要添加空格
# Correct
def complex(real, imag=0.0):
  pass

# not recommended
def complex(real, imag = 0.0):
  pass
  • 在list,dict中选择时,按照可读性,不要在+1的中间添加不必要的空格,使得代码可读性下降,也可以把它看作参数输入
dic = {}
dic[n] = 1
return dic[dic[i]+1]
  • 左括号之后,右括号之前不要添加不必要的空格
# Correct
spam(ham[1], {egg: 2})

# Not recommended
sapm( ham[1], { eggs : 2} )
  • 字典对象的括号之前不要多余的空格
# Corrent
dict['key'] = list[index]

# not recommended
dict ['key'] = list [index]
  • 不要为了对齐而使用额外的空格
# Correct
x = 1
y = 2
long_var = 3

# Not recommended
x        = 1
y        = 2
long_var = 3

换行

Python支持括号内的换行,此时有两种情况

  • 第二行缩进到括号起始处
foo = long_func_name(var_one, var_two,
                     var_three, var_four)
  • 第二行缩进四个空格,适用于起始括号就换行的情形
def long_func_name(
    var_one, var_two, var_three,
    var_four):
  print(var_one)
  • 使用反斜杠换行,二元运算符应该在行末
session.query(myTable).\
        filter_by(id=1).\
        one()
  • 不推荐复合语句

  • if/for/while 最好换行

# Corrent
if foo == 'blah':
  do_something()

# Not recommended
if foo == 'blah': do_something()

docstring

docstring规范中最基本的两点:

  • 所有的公共模块、函数、类、方法,都应该写 docstring 。私有方法不一定需要,但应该在 def 后提供一个块注释来说明。

  • docstring 的结束”””应该独占一行,除非此 docstring 只有一行。

"""Return a foobar
Optional do do_something
"""

"""Oneline docstring"""

作为文档的Docstring一般出现在模块头部、函数和类的头部,这样在python中可以通过对象的doc对象获取文档。编辑器和IDE也可以根据Docstring给出自动提示。

  • 文档注释以 “”” 开头和结尾, 首行不换行, 如有多行, 末行必需换行, 以下是Google的docstring风格示例
"""Example docstrings

This module demostrates documentation as specified by the `Google Python Style Guide`_. DOcstrings may extend over multiple lines. Sections are with a section header and a colon followed by a block of indented text.

Example:
  Examples can be given using either the `Example` or `Examples` sections. Sections support any reStructuredText formatiing, including literal blocks::

    $ python example_google.py

Sections breaks are created by resuming unindented text. Sections breaks are also implicitly created anytime a new sections starts
"""
  • 不要在文档注释复制函数定义原型, 而是具体描述其具体内容, 解释具体参数和返回值等
#  不推荐的写法(不要写函数原型等废话)
def function(a, b):
    """function(a, b) -> list"""
    ... ...

#  正确的写法
def function(a, b):
    """计算并返回a到b范围内数据的平均值"""
  • 对函数参数、返回值等的说明采用numpy标准, 如下所示
def func(arg1, arg2):
  """Summary of the function
  Detailed description

  Argument
  ---------
  arg1 : int
    detailed for arg1
  arg2 : int
    details for arg2

  Return
  ---------
  int
    details

  Reference
  ---------
  otherfunc: 其他关联函数

  Demo
  ---------
  示例使用doctest格式, 在`>>>`后的代码可以被文档测试工具作为测试用例自动运行

  >>> a = [1, 2, 3]
  >>> ans = [x + 3 for x in a]
  >>> print(ans)
  [4, 5, 6]
  """

文档注释不限于中英文, 但不要中英文混用

文档注释不是越长越好, 通常一两句话能把情况说清楚即可

  • 模块、公有类、公有方法, 能写文档注释的, 应该尽量写文档注释

注释

块注释

#后空一格, 段落用空行分开,英文开头大写

# Block comment
# Block comment
#
# Block comment

行注释

至少使用两个空格和语句分开,注意不要使用无意义的注释

# 正确的写法
x = x + 1  # 边框加粗一个像素

# 不推荐的写法(无意义的注释)
x = x + 1 # x加1

其他

在代码的关键部分(或比较复杂的地方), 能写注释的要尽量写注释

比较重要的注释段, 使用多个等号隔开, 可以更加醒目, 突出重要性

app = create_app(name, options)

# ========================
# Please don't add other feature here
# ========================

if __name__ == '__main__':
  app.run()

命名规范

模块

模块尽量使用小写命名,首字母保持小写,尽量不要用下划线(除非多个单词,且数量不多的情况)

# Correct
import decorder
import html_parser

# Not recommended
import Decorder

类名

  • 类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头
class Farm():
  pass


class AnimalFarm(Farm):
  pass


class _PrivateFarm(Farm):
  pass
  • 将相关的类和顶级函数放在同一个模块里. 不像Java, 没必要限制一个类一个模块

函数

  • 函数名一律小写,如有多个单词,用下划线隔开
def run():
  pass

def run_with_env():
  pass
  • 私有函数在函数前加一个下划线_
class Person():

  def _private_func():
    pass

变量名

  • 变量名尽量小写, 如有多个单词,用下划线隔开
if __name__ == '__main__':
  count = 0
  school_name = ''

常量

常量采用全大写,如有多个单词,使用下划线隔开

MAX_CLIENT = 100
MAX_CONNECTION = 1000
CONNECTION_TIMEOUT = 600

规范

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

Python单元测试 上一篇
动态规划 下一篇