Python的pep8(代码规范)
Python的pep8-代码规范
1、 代码布局设计
1.1 缩进
A、 使用四个空格来进行缩进
B、 换行的时候可以使用反斜杠,最好的方法是使用园括号,在使用反斜杠的时候,在反斜杠的后直接回车,不能有任何空格存在
比较好的做法如下:
对准开始的分隔符:
# Aligned with opening delimiter. foo = long_function_name(var_one, var_two, var_three, var_four) |
包含更多的缩进表示是剩余部分:
# More indentation included to distinguish this from the rest. def long_function_name( var_one, var_two, var_three, var_four): print(var_one) |
悬挂缩进应该添加一个级别:
# Hanging indents should add a level. foo = long_function_name( var_one, var_two, var_three, var_four) |
比较差的做法如下:(代码同样是可以运行的)
# Arguments on first line forbidden when not using vertical alignment.—未使用垂直对齐 foo = long_function_name(var_one, var_two, var_three, var_four) # Further indentation required as indentation is not distinguishable.(未使用缩进来表示每一层级) def long_function_name( var_one, var_two, var_three, var_four): print(var_one) |
对于续行来说,四个空格的缩进是可选的。
可选的如下:
# Hanging indents *may* be indented to other than 4 spaces.悬挂缩进的时候可以不是四个空格 foo = long_function_name( var_one, var_two, var_three, var_four) |
当使用if语句的时候,如果条件恰好的缩进为四个空格空格,那么导致后面的语句的缩进也是四个空格,那么这种情况下是可以接受的,如下所示:
没有额外的缩进:
# No extra indentation. if (this_is_one_thing and that_is_another_thing): do_something() |
添加一个注释来进行分割缩进,做到语法高亮显示:
# Add a comment, which will provide some distinction in editors # supporting syntax highlighting. if (this_is_one_thing and that_is_another_thing): # Since both conditions are true, we can frobnicate. do_something() |
在续行中添加额外的缩进:
# Add some extra indentation on the conditional continuation line. if (this_is_one_thing and that_is_another_thing): do_something() |
成对的小括号,中括号在多行的结构中可以写成多行,然后括号在第一个不为空白的位置结束。如下:
my_list = [ 1, 2, 3, 4, 5, 6, ] result = some_function_that_takes_arguments( 'a', 'b', 'c', 'd', 'e', 'f', ) |
或者对齐第一个字符的位置结束,如下:
my_list = [ 1, 2, 3, 4, 5, 6, ] result = some_function_that_takes_arguments( 'a', 'b', 'c', 'd', 'e', 'f', ) |
1.2 tab和空格的选择
关于tab的空格的选择,在python2中是可以混用的,但是在python3中,只能用一种风格。
1.3 最大行长度
行的最大长度为79个字符
在书写文档或者是注释的时候,行长度应该控制在72个字符。
反斜杠在有的时候是适用的,例如在参数很长,但是不能隐式的使用多行的时候,如下反斜杠的使用:
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()) |
确保在合适的时候将连续的行进行分开,最好的位置是操作符之后,而不是在操作符之前,如下:
class Rectangle(Blob): def __init__(self, width, height, color='black', emphasis=None, highlight=0): if (width == 0 and height == 0 and color == 'red' and emphasis == 'strong' or highlight > 100): raise ValueError("sorry, you lose")
if width == 0 and height == 0 and (color == 'red' or emphasis is None): raise ValueError("values are %s, %s" %
(width, height)) Blob.__init__(self, width, height, color, emphasis, highlight) |
1.4 空行
Top level函数和类的定义的时候,空两行。
类中方法的定义空一行。
在函数中谨慎使用空行来表示相关的逻辑段。
无关的函数之间用一个空行进行分割。
1.5 源文件编码
在源文件中一直使用utf-8编码,在python2中使用ascll编码。
文件,在python2 中使用ascll编码,在python3中使用utf-8编码
1.6 导入
Import经常使用单独的行,如下:
import os import sys |
或者使用如下的方式:
|
§ from subprocess import Popen, PIPE |
Import总是在文件的最上行,在模块的注释和docstring之后,在模块的全局变量之前。
Import可以按照以下顺序进行组织:
A标准类库import
B第三方import
C本地类库import
在每个组导入之后,可以用空行进行分割
把所有__all__相关类型的声明放在import之后
推荐使用绝对导入,可读性强,如下:
|
import mypkg.sibling from mypkg import sibling from mypkg.sibling import example |
对于复杂的封装布局来说,相对导入也是可以接受的,主要是使用绝对导入的时候路径太长,如下:
|
from . import sibling from .sibling import example |
当导入一个类的时候,可以使用如下的方式:
|
from myclass import MyClass from foo.bar.yourclass import YourClass |
当以上的写法导致本地名称冲突,可以写成如下:
|
import myclass import foo.bar.yourclass |
并且使用"myclass.MyClass" and"foo.bar.yourclass.YourClass"。
在导入模块的时候,应该避免通配符的存在,如下:
|
from <module> import * |
2、 字符串引号
在对于字符串的标示中,使用双引号还是单引号是没有区别的,主要就是两者混合使用从而避免反斜杠的出现。
3、 在表达式和语句中使用空格
3.1 避免使用空格情况
A. 在小括号,中括号,大括号中避免使用空格
|
Yes: spam(ham[1], {eggs: 2}) No: spam( ham[ 1 ], { eggs: 2 } ) |
B. 在逗号,分好,冒号之前不需要空格
|
Yes: if x == 4: print x, y; x, y = y, x No: if x == 4 : print x , y ; x , y = y , x |
C. 在切片的时候,避免使用空格,在扩展的切片中,必须使用相同的空格个数,如下所示:
|
Yes: ham[1:9], ham[1:9:3], ham[:9:3], ham[1::3], ham[1:9:] ham[lower:upper], ham[lower:upper:], ham[lower::step] ham[lower+offset : upper+offset] ham[: upper_fn(x) : step_fn(x)], ham[:: step_fn(x)] ham[lower + offset : upper + offset] No: ham[lower + offset:upper + offset] ham[1: 9], ham[1 :9], ham[1:9 :3] ham[lower : : upper] ham[ : upper] |
D.函数的左括号前不要添加空格:
|
Yes: spam(1) No: spam (1) |
E. 中括号前不要添加空格
|
Yes: dct['key'] = lst[index] No: dct ['key'] = lst [index] |
F. 操作符左右各一个空格,不要为了追求一致从而添加空格个数
|
Yes: x = 1 y = 2 long_variable = 3 No: x = 1 y = 2 long_variable = 3 |
3.2 其他建议
A. 避免在任何结尾添加空白。
B. 在下列操作符中左右各留空白
|
assignment ( = ), augmented assignment |
C. 如果操作符优先级不同,注意在操作符左右留空白,特别是高优先级和低优先级的
|
i = i + 1 submitted += 1 x = x*2 - 1 hypot2 = x*x + y*y c = (a+b) * (a-b) No: i=i+1 submitted +=1 x = x * 2 - 1 hypot2 = x * x + y * y c = (a + b) * (a - b) |
D. 在使用函数的时候,赋值和默认值之间不需要空格
|
Yes: def complex(real, imag=0.0): return magic(r=real, i=imag) No: def complex(real, imag = 0.0): return magic(r = real, i = imag) |
E. 不要将多语句写在同一行
|
Rather not: if foo == 'blah': do_blah_thing() for x in lst: total += x while t < 10: t = delay() Definitely not: if foo == 'blah': do_blah_thing() else: do_non_blah_thing() try: something() finally: cleanup() do_one(); do_two(); do_three(long, argument, list, like, this) if foo == 'blah': one(); two(); three() |
4、 注释
在修改的代码的时候,务必修改注释。
注释必须是英文,最好是完整的句子,首字母大写
4.1 块注释
在一段代码前增加注释,在#后添加一个空格,段落之间只有一个#作为行间隔
|
# Description : Module config. # # Input : None # # Output : None |
4.2 行注释
在使用行注释的时候,在代码句子结束之后至少两个空格,然后用#开头后跟一个空格
|
x = x + 1 # Increment x But sometimes, this is useful: x = x + 1 # Compensate for border |
在上面例子中,表示不要使用无效注释,主要是说明其目的
4.3 文档注释
在所有的公共模块,函数,类,方法中加入文档注释,这些注释写在def之后。
在进行多行注释的时候,注意“”“结束的时候,必须独占一行,如下:
|
"""Return a foobang Optional plotz says to frobnicate the bizbaz first. """ |
当文档注释是一行的时候,确保开始的““”和“”“在同一行中。
5、 命名规范
使用单独的小写字母(b)
使用单独的大写字母(B)
使用小写字母(lowercase)
使用小写字母和下划线(lower_case_with_underscores)
使用大写字母(UPPERCASE)
使用大写字母和下划线(UPPER_CASE_WITH_UPPERCASE)
驼峰式写法(CamelCase):在使用缩写的时候,大写优于小写例如HTTPServer优于HttpServer
首字母大写,然后使用下划线是一种丑陋的写法
5.1 避免使用的名称
在写变量的时候,尽量避免小写的l和大写字母O和大写字母I,主要原因是容易和数字中1,0相混淆
5.2 包和模块名称
模块尽量使用简短的全部小写的名称,如果可以增加可读性那么可以使用下划线,python的包不推荐使用下划线,但是在引用其他语言写的扩展包中可以使用下划线来表示区分
5.3 类名称
类名称主要遵循为CapWords约定,表示为首字母大写
5.4 异常名称
异常归于类,从而也要遵循类名的规范,主要是在后缀上必须添加“Error“
5.4 全局变量名
全局变量只在模块类有效,和function命名相同
5.5 方法名称
方法名称全部为小写,下划线是可选的(在增加可读性的基础上使用)
5.6 方法变量
类的方法第一个参数总是self
类方法的静态变量总是为crs
如果一个方法的参数和保留字相冲突,那么在后面添加下划线进行区分
5.7 常量
常量命名全部使用大写,可以使用下划线进行分割
6、 编码建议
单独比较的时候使用is或者is not,不要使用==进行比较。
当实现比较的方法的时候,最好全部实现
__eq__ , __ne__ ,__lt__ , __le__ , __gt__ , __ge__ ),而不要单独实现一个。
使用startswith() and endswith()代替切片进行序列前缀或后缀的检查。比如
Yes: if foo.startswith(‘bar’):优于
No: if foo[:3] == ‘bar’:
7 使用isinstance()比较对象的类型。比如
Yes: if isinstance(obj, int): 优于
No: if type(obj) is type(1):
Python的pep8(代码规范)的更多相关文章
- python的PEP8代码规范
一.缩进:每级缩进用4个空格.如果缩进不正确或缩进格式不统一,一般错误信息会明确告诉你,但有时也会出现invalid syntax报错.所谓缩进不正确,python的缩进是四个空格或一个TAB,如果缩 ...
- Python pep8代码规范
title: Python pep8代码规范 tags: Python --- 介绍(Introduction) 官方文档:PEP 8 -- Style Guide for Python Code 很 ...
- python PEP8代码规范及问题
最近刚刚接触Python,为了养成好习惯,尽量保证自己写的代码符合PEP8代码规范,下面是过程中报出的警告及解决方法,英文有些翻译不太准确见谅,会不断更新: PEP 8: module level i ...
- python的PEP8 代码风格指南
PEP8 代码风格指南 这篇文章原文实际上来自于这里:https://www.python.org/dev/peps/pep-0008/ 知识点 代码排版 字符串引号 表达式和语句中的空格 注释 版本 ...
- Python 常用 PEP8 编码规范
Python 常用 PEP8 编码规范 代码布局 缩进 每级缩进用4个空格. 括号中使用垂直隐式缩进或使用悬挂缩进. EXAMPLE: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 ...
- python基础(代码规范、命名规范、代码缩进、注释)
代码规范 PEP8(python增强建议书第8版) 每个import语句只导入一个模块 不要在行尾添加分号";" 建议每行不超过80个字符 超出部分可以用()来进行换行例如: ...
- python基础autopep8__python代码规范
关于PEP 8 PEP 8,Style Guide for Python Code,是Python官方推出编码约定,主要是为了保证 Python 编码的风格一致,提高代码的可读性. 官网地址:http ...
- python基础===autopep8__python代码规范
关于PEP 8 PEP 8,Style Guide for Python Code,是Python官方推出编码约定,主要是为了保证 Python 编码的风格一致,提高代码的可读性. 官网地址:http ...
- 你所遵循的PEP8代码规范是什么?请举例说明其要求?
1. 变量常量:大写加下划线 USER_CONSTANT.私有变量 : 小写和一个前导下划线 _private_value.Python 中不存在私有变量一说,若是遇到需要保护的变量,使用小写和一个前 ...
- Python 常用 PEP8 编码规范和建议
代码布局 缩进 每级缩进用4个空格. 括号中使用垂直隐式缩进或使用悬挂缩进. EXAMPLE: # (垂直隐式缩进)对准左括号 foo = long_function_name(var_one, va ...
随机推荐
- Socket基础编程
地址结构sockaddr_in 其中包含:IP地址,端口号,协议族推荐使用sockaddr_in,而不建议使用sockaddrsockaddr_in与sockaddr是等价的,但sockaddr_in ...
- 20_采用ContentProvider对外共享数据
<AndroidManifest.xml> <application <provider android:name=".PersonProvider&q ...
- jdbc框架 commons-dbutils的使用
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序 ...
- django中post方法和get方法的不同
当我们提交表单仅仅需要获取数据时就可以用GET: 而当我们提交表单时需要更改服务器数据的状态,或者说发送e-mail,或者其他不仅仅是获取并显示数据的时候就使用POST. 在这个搜索书籍的例子里,我们 ...
- mysql高可用方案比较
详见:High Availability Database Tools http://www.acquia.com/blog/high-availability-database-tools
- Gradle学习系列(一)
今天就开始学习Gradle构建了,听说很牛X.本篇内容就带领我初步窥探Gradle的世界. 1.什么是Gradle 相信之前都接触过用Ant或者Meavn进行项目的构建,两者各有千 ...
- many to one could not resolve property
今天在做一个功能的时候 遇到了.一个Could not resolve property 的问题. 配置文件如下: <many-to-one name="user" cla ...
- easyui tree 模仿ztree 使用扁平化加载json
1,载入扩展JS //作者孙宇 //自定义loadFilter的实现 $.fn.tree.defaults.loadFilter = function (data, parent) { var opt ...
- HDU 1698 (线段树 区间更新) Just a Hook
有m个操作,每个操作 X Y Z是将区间[X, Y]中的所有的数全部变为Z,最后询问整个区间所有数之和是多少. 区间更新有一个懒惰标记,set[o] = v,表示这个区间所有的数都是v,只有这个区间被 ...
- (转载)NSTimer
转自:http://www.cnblogs.com/smileEvday/archive/2012/12/21/NSTimer.html 看到这个标题,你可能会想NSTimer不就是计时器吗,谁不会用 ...