PEP8 - WBowam/wbowam.github.com GitHub Wiki

Date: 2014-05-14
Title: PEP8 总结
Tags: Django,python
Category: It

pep8除了是一个标准,也是一个软件包的名字。
提供一个pep8检测器。
运行很简单:pep8 INPUT_FILES ...
查看帮助:pep8 --help

一般来说,如果要检查代码,pylint和pep8最好都运行一下。pep8只能检测格式,pylint不仅检测格式,还检测语意。

下文参考总结bobo的日记,感谢前辈分享~~~


一 代码编排

1 缩进。4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格。python3 已经不允许空格和Tab混用了。
2 每行最大长度79,换行可以使用反斜杠。换行点要在操作符的后边敲回车。

with open('/path/to/some/file/you/want/to/read') as file_1, \
        open('/path/to/some/file/being/written', 'w') as file_2:
    file_2.write(file_1.read())

3 类和top-level函数定义之间空两行;类中的方法定义之间空一行;函数内逻辑无关段落之间空一行;其他地方尽量不要再空行。
4 和括号开始的部分对齐:

foo = long_function_name(var_one, var_two,
                         var_three, var_four)

#需要更多一层的缩进
def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)
## 千万不能与下一个代码行对齐。。。。

5 在闭合的括号中不要加空格

my_list = [
    1, 2, 3,
    4, 5, 6,
]
result = some_function_that_takes_arguments(
    'a', 'b', 'c',
    'd', 'e', 'f',
)

二 文档编排

1 模块内容的顺序:模块说明和docstring—import—globals&constants(静态或全局变量)—其他定义。
使用绝对路径import,不用import * ,可能会导入到名字相同的冲突的包
包含顺序也有讲究,顺序如下(他们之间最好加一个换行):

  • 标准库
  • 第三方库
  • 本地的应用或者库
    2 不要在一句import中多个库,比如import os, sys不推荐。
    3 如果采用from XX import XX引用库,可以省略‘module.’,都是可能出现命名冲突,这时就要采用import XX。

三 空格的使用

    总体原则,避免不必要的空格。

1 各种右括号前不要加空格。
2 逗号、冒号、分号前不要加空格。

Yes: if x == 4: print x, y; x, y = y, x
No:  if x == 4 : print x , y ; x , y = y , x

3 函数的左括号前不要加空格。如Func(1)。序列的左括号前不要加空格。如list[2]。
4 不要为了对齐增加空格。
5 操作符左右各加一个空格.
6 缺省值等号两边无空格:

def connect(self, user=None):
    self._user = user

7 不要将多句语句写在同一行,尽管使用‘;’允许。
8 if/for/while语句中,即使执行语句只有一句,也必须另起一行。

四 注释

    总体原则,错误的注释不如没有注释。所以当一段代码发生变化时,第一件事就是要修改注释!
    注释必须使用英文,最好是完整的句子,首字母大写,句后要有结束符,结束符后跟两个空格,开始下一句。
    如果是短语,可以省略结束符。

1 块注释,在一段代码前增加的注释。在‘#’后加一空格。段落之间以只有‘#’的行间隔。比如:

# Description : Module config.
# 
# Input : None
#
# Output : None

2 行注释,在一句代码后加注释。比如:x = x + 1 # Increment x
但是这种方式尽量少使用。
3 避免无谓的注释。

五 命名规范

1 常量 : 大写加下划线

STATUS = {
    0: u'正常',
    1: u'草稿',
    2: u'删除',
}

# 加下划线
POST_STATUS = {
    0: u'正常',
    1: u'草稿',
    2: u'删除',
}

2 类总是使用驼峰格式命名,即所有单词首字母大写其余字母小写。类名应该简明,精确.

class UserProfile(BaseProfile):
    def __init__(self, profile):
        return self._profile = profile

    def profile(self):
        return self._profile

3 模块和包.除特殊模块 init 之外,模块名称都使用不带下划线的小写字母。
若是它们实现一个协议,那么通常使用lib为后缀,例如:

import smtplib
import os
import sys
分行包含:
Yes: import os
     import sys

No:  import sys, os
下面的也可以:
from subprocess import Popen, PIPE

4 使用 has 或 is 前缀命名布尔元素

is_connect = True
has_member = False

5 用复数形式命名序列

members = ['user_1', 'user_2']

6 避免通用名称,避免现有名称
诸如 list, dict, sequence 或者 element 这样的名称应该避免
诸如 os, sys 这种系统已经存在的名称应该避免。

7 异常名:加入后缀Error
8 函数名:小写+下划线
9 函数和方法的参数:实例使用self 开始,类使用cls 开始。如果和系统参数名重复,在其后加_

六 验证脚本

可以安装一个 pep8 脚本用于验证你的代码风格是否符合 PEP8。

pip install pep8
pip install --upgrade pep8
pip uninstall pep8

Example usage and output

$ pep8 --first optparse.py
# 也可以传一个文件夹,pep8 --first apps/  
optparse.py:69:11: E401 multiple imports on one line
optparse.py:77:1: E302 expected 2 blank lines, found 1
optparse.py:88:5: E301 expected 1 blank line, found 0
optparse.py:222:34: W602 deprecated form of raising exception
optparse.py:347:31: E211 whitespace before '('
optparse.py:357:17: E201 whitespace after '{'
optparse.py:472:29: E221 multiple spaces before operator
optparse.py:544:21: W601 .has_key() is deprecated, use 'in'

You can also make pep8.py show the source code for each error, and even the relevant text from PEP 8:

$ pep8 --show-source --show-pep8 testsuite/E40.py
testsuite/E40.py:2:10: E401 multiple imports on one line
import os, sys
         ^
    Imports should usually be on separate lines.

    Okay: import os\nimport sys
    E401: import sys, os
你也可以装上sublime2插件AutoPEP8,右键即可规范代码
AutoPEP8:
--------

  Sublime Auto PEP8 Formatting
  (https://github.com/wistful/SublimeAutoPEP8)
  
  Automatically formats Python code to conform to the PEP 8 style guide using autopep8 module
  Support ST2 and ST3
  
  Features:
      format / preview code according PEP8
      format / preview selected text
      format / preview all python modules in folder
      side bar menu
      formated code while saving
  
  Using:
      SideBar - right click on the file(s) or folder(s)
      Active view - right click on the view
      Selected text - right click on the selected text
      On Save - provide by settings: option format_on_save
      Command Palette - bring up the Command Palette and select `PEP8: Format Code` or `PEP8: Preview Changes`
      Hotkeys - `Command/Control + Shift + 8` to format code, `Command/Control + 8` to preview changes

七 源码文件的编码

python2 默认ASCII ,python3 默认utf8
都用utf8省事