Python编程规范(PEP8)
Python编程规范(PEP8)
代码布局
缩进
对于每一次缩进使用4个空格。使用括号、中括号、大括号进行垂直对齐,或者缩进对齐。
制表符还是空格?
永远不要将制表符与空格混合使用。Python最常用的缩进方式是只是用空格。
当调用Python命令行的 -t 选项时,它会检测并警告代码非法混合使用制表符和空格。当使用 -tt 选项时,警告变成了错误。
最大行长度
限制所有行最长为79个字符。
使用反斜杠来分行是一个很好的选择。
我们应当选择在二元操作符之后进行分行,而不是之前。
空行
使用两行空行来分隔顶层函数和类定义。
使用单行空行来分隔类方法定义。
在函数中使用空行来表示不同的逻辑块。
编码
Python核心发行代码里面优先使用ASCII码或Latin-1编码。3.0后UTF-8编码优先于Latin-1。
导入
每一个导入通常应当使用单独的行。
导入应当位于文件顶部,在模块注释和文档字符串之后,在全局变量和常量之前。
导入应当按以下顺序分组,且每组导入之间使用空行隔开:
1、标准库导入
2、第三方库导入
3、本地应用程序/定制库导入
使用绝对包路径导入。
表达式和语句中的空格
注释
误导的注释不如没有注释
注释应当为完整的句子,且句号结尾的句子后面应当有2个空格。如果注释很短,那么结尾的句号可以忽略。
块注释
块注释应当和代码缩进保持一致。每行注释开头应以#开头,然后紧跟一个空格。
行注释
行注释至少和语句间隔2个空格。同样的注释应当以#开头,然后紧跟一个空格。
文档字符串
对于所有的公有模块、类、函数和方法都需要编写文档字符串。
""" 作为多行的文档字符串的结束,应该单独一行,并且之前有一个空行。
对于只有一行的文档字符串来说,结尾的 """ 在同一行。
更详细的文档字符串规范见 PEP 257。
命名规范
目前Python库的命名规范尚未达成一致,但有一些推荐的标准。
在Python里面,有一些具有特定意义的下划线前缀或者后继的特殊格式。如:
1、_single_leading_underscore:(单下划线开始)弱"内部使用"指示器。例如:from M import * 不会导入以下划线开始的对象。
2、single_trailing_underscore_:(单下划线结束)规定使用其来避免与Python关键字冲突,例如:
Tkinter.Toplevel(master, class_='ClassName') 在参数class后面加单下划线,避免与关键字class冲突
3、__double_leading_underscore:(双下划线开始)命名一个类的属性时,调用"name mangling"(类FooBar中,__boo 变为了 _FooBar__boo; 见下文)
4、__double_leading_and_trailing_underscore__:(双下划线开始和结束)存活在用户控制命名空间的"magic"对象或属性。 例如__init__, __import__ 或 __file__。永远不要起这样的名字。
避免使用的命名
不要使用小写的L、大写的O、以及大写的I作为单字符变量名。
包与模块名称
模块应当使用简短、全小写的名字,也可使用下划线连接来提高可读性。
包也应当使用简短、全小写的名字,但不要使用下划线。
这是由于模块名与文件名关联,而在某些文件系统中大小写不敏感,且会截断过长的名字。
当使用C/C++来编写一个扩展模块时,应当使用下划线作为模块名的前缀。
类名
类名应当使用驼峰式(CapWords)。内部使用的类名应当加下划线前缀。
异常名
异常也是一个类,所以需要遵循类名规则。但如果你的异常确实是个错误的话,请使用Error前缀。
全局变量名
遵循函数规则。
函数名
函数名全小写,可以使用下划线分隔来提高可读性。
函数与方法参数
使用self作为实例方法的第一个参数。
使用cls作为类方法的第一个参数。
当函数的参数名与保留字冲突时,使用下划线后缀(第二次提醒)。
方法名与实例变量
遵循函数规则。
在私有方法和实例变量前用单下划线前缀。
使用双下划线前缀来调用"name mangling"来避免与子类命名冲突。
如果类Foo有个属性叫__a,那么它不能使用Foo.__a读取,但仍然可以Foo._Foo__a来读取。
常量
常量通常在模块级别定义,使用全大写和下划线分隔的形式。
继承设计
在设计类的方法或实例变量时,应当觉得其实公有的还是非公有的。当不能确定时,设计为私有的。
在Python中没有真正的私有属性。
公有属性不应当使用下划线开始。
当公有属性与保留字冲突时,在名称后面加下划线后缀(第三次提醒)。
对于简单的公有属性,最好直接访问其属性名,而非get/set方法。
编程建议
代码应当适用于Python的多个实现。比如不要依赖CPython的高效字符串语句 a+=b,而应当使用join,从而保证在不同实现上的线性开销。
当与类似于None的单例(singleton)进行比较式,要使用is 或者 is not, 而不是使用等于操作。
当使用复杂比较实现排序操作时,最好实现全部的六个比较操作。
使用基于对象的异常。
模块或者包应当定义自己的异常基类,这个类应当继承自内置的Exception类。
当抛出一个异常的时候,使用raise ValueError('message')代替旧的raise ValueError, 'message'格式。这是由于当异常的参数很长或者是格式化字符串的时候,由于括号的关系,我们不需要使用多行连接符。 旧的格式在Python 3 中被移除。
当捕获一个异常的时候,要用详细的异常声明来代替简单的except: 语句。
一个空的except:语句将会捕获 SystemExit 和 KeyboardInterrrupt 异常。这会使得很难用Control-C来中断一个程序,并且还会隐藏其他的问题。
另外,对于所有的try/except语句,限制try语句来减少必要代码的数量。 再者,可以避免掩盖问题。
Yes:
try: value = collection[key] except KeyError: return key_not_found(key) else: return handle_value(value)
No:
try: # Too broad! return handle_value(collection[key]) except KeyError: # Will also catch KeyError raised by handle_value() return key_not_found(key)
使用''.startswith() 和 ''.endswith()而非字符切片去检测前缀或后缀。
对象类型比较总要用 isinstance() 而非直接比较。
对于序列,(strings, lists, tuples),利用空序列为false这一点来进行判断,而非使用长度来判断。
别用‘==’进行布尔值和 True 或者 False 的比较。
Python编程规范(PEP8)的更多相关文章
- Python 编程规范-----转载
Python编程规范及性能优化 Ptyhon编程规范 编码 所有的 Python 脚本文件都应在文件头标上 # -*- coding:utf-8 -*- .设置编辑器,默认保存为 utf-8 格式. ...
- Python编程规范及性能优化(转载)
转载地址:http://codeweblog.com/python编程规范及性能优化/
- Python学习手册之 Python 之禅、Python 编程规范和函数参数
在上一篇文章中,我们介绍了 Python 的正则表达式使用示例,现在我们介绍 Python 之禅. Python 编程规范和函数参数.查看上一篇文章请点击:https://www.cnblogs.co ...
- PEP8 Python编程规范
官方文档: https://www.python.org/dev/peps/pep-0008/ ---------------------------------------------------- ...
- Python 编程规范梳理
缘由 由于项目团队中新加入了几名攻城狮, 大家之前的背景各不相同,写出的代码也是“风格迥异”.正所谓:“无规则不成方圆”,因此需要对编程进行必要的规范. 整体的思路是:依照PEP8 Python 编码 ...
- 学习 python 编写规范 pep8 的问题笔记
决定开始Python之路了,利用业余时间,争取更深入学习Python.编程语言不是艺术,而是工作或者说是工具,所以整理并遵循一套编码规范是十分必要的.所以今天下午我根据PEP 8整理了一份,以后都照此 ...
- Python 编程规范 —— TODO 注释(结合 PyCharm)
编程是代码和注释的统一: TODO 自然表示需要做而未做的一些待完成的事项,有助于事后的检索,以及对整体项目做进一步的修改迭代. # TODO(kl@gmail.com): Use a "* ...
- Python编码规范(PEP8)
Introduction 介绍 本文提供的Python代码编码规范基于Python主要发行版本的标准库.Python的C语言实现的C代码规范请查看相应的PEP指南1. 这篇文档以及PEP 257(文档 ...
- 002.[python学习]python编码规范pep8学习——PEP8第一部分代码布局
关于PEP8的详细说明可以参考官方原文:http://legacy.python.org/dev/peps/pep-0008/ 我参考官方文档及其他文章,摘出相关内容而得此文章,具体参考其他文章见文中 ...
随机推荐
- Tomcat容器运行struts2+spring+mybatis架构的java web应用程序简单分析
1.具体的环境为 MyEclipse 8.5以及自带的tomcat spring3.0.5 struts2.3.15.1 mybatis3.0.5 2.想弄明白的一些问题 tomcat集成spring ...
- 无线安全渗透测试套件WiFi-Pumpkin新版本发布
WiFi-Pumpkin是一款无线安全检测工具,利用该工具可以伪造接入点完成中间人攻击,同时也支持一些其它的无线渗透功能.旨在提供更安全的无线网络服务,该工具可用来监听目标的流量数据,通过无线钓鱼的方 ...
- GSM BTS Hacking: 利用BladeRF和开源BTS 5搭建基站
引文 如果你已经购买了Nuand(官方)BladeRF x40,那么就可以在上面运行OpenBTS并可以输入一些指令来完成一些任务.一般来说HackRF,是一款覆盖频率最宽的SDR板卡.它几乎所有的信 ...
- 数据结构 《2》----基于邻接表表示的图的实现 DFS(递归和非递归), BFS
图通常有两种表示方法: 邻接矩阵 和 邻接表 对于稀疏的图,邻接表表示能够极大地节省空间. 以下是图的数据结构的主要部分: struct Vertex{ ElementType element; // ...
- Unity C#和OC互相调用
Unity 两种方式 一般都是组合使用 1.[DllImport("__Internal")] C#调用oc 2.UnitySendMessage oc调用C# ...
- 12、SQL基础整理(运算符与优先级)
运算符 + - * / %(取余),赋值运算符 = declare @jia int set @jia = 1+1 print @jia declare @jia int set @jia = 10% ...
- LeetCode Search a 2D Matrix(二分查找)
题意: 有一个矩阵,每行都有序,每行接在上一行尾后仍然有序.在此矩阵中查找是否存在某个数target. 思路: 这相当于用一个指针连续扫二维数组一样,一直p++就能到最后一个元素了.由于用vector ...
- 简明python教程 --C++程序员的视角(八):标准库
os模块 这个模块包含普遍的操作系统功能. 如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.一个例子就是使用os.sep可以取代操作系统特定的路径分割符. os.system() 执行li ...
- Qt之添加Windows资源文件(.rc文件)
简述 在Windows下使用Qt时,通常会用到Windows的资源文件 - 为exe设置信息,其中包括:文件说明.产品名称.产品版本.版权等信息... 由于是Windows平台相关的东西,Qt助手中对 ...
- Git 基础学习篇(应用-windows篇)
此篇教程主要是讲应用,因为理论,,,额,我也说不出来.大家要深入学习还是看廖老师的教程吧. 可以把这篇当作一个简单应用的参考,因为当初看廖老师的也难看啊!!! 以下是资料: 廖雪峰-Git教程 [Gi ...