Python编程规范(PEP8)阅读摘要_adwfcu的博客-程序员秘密

技术标签: Python  

  工作中写了个Python的模块,CodeReview的时候被告知有些不符合Python规范的地方。于是找到了PEP8的全文(http://www.python.org/dev/peps/pep-0008/)阅读了一番,还是受益匪浅。下面是做的一些摘要。

在项目中保持风格的一致性。

代码布局

缩进

对于每一次缩进使用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 = http://www.cnblogs.com/zeutrap/archive/2012/08/29/collection[key]except KeyError:    return key_not_found(key)else:    return handle_value(value)

    No:

    try:    # 太宽了!    return handle_value(collection[key])except KeyError:    # 将会Catch 函数handle_value()中抛出的异常    return key_not_found(key)
使用 ''.startswith()  和  ''.endswith() 而非字符切片去检测前缀或后缀。
对象类型比较总要用 isinstance() 而非直接比较。
对于序列,(strings, lists, tuples),利用空序列为false这一点来进行判断,而非使用长度来判断。
别用‘==’进行布尔值和 True 或者 False 的比较。
 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/adwfcu/article/details/9340999

智能推荐

谈谈java中的集合框架_丨Yuner的博客-程序员秘密

集合框架中的接口。List的主要特点就是有序性和元素的可空性。 ArrayList(数组实现)和LinkedList(双向链表实现)Set主要特性是唯一性。自动排序。HashSet,LinkedHashSet,TreeSetQueue 特性是队列Map健值对 继承自ObjectList,Set,Queue,Map参考链接Set (无序,唯一)HashSet底层数据结构是哈希表哈希表依赖两个方法 hashCode()和equals()执行顺序: 首先判断hashCode()值.

@Valid注解的相关用法_Tess_ty的博客-程序员秘密

2018/11/23这个博主整理了一系列@Valid的用法,感觉很齐,马克【https://blog.csdn.net/weixin_38118016/article/details/80977207】

封装OpenGL渲染为DLL,C#做UI显示_伍心的博客-程序员秘密

C# 环境下OpenGL的渲染,有很多的开源库,如:The Tao Framework+.net、SharpGL、opengl4csharp、OpenGL.Net、CSharpGL等等,大体都是将OpenGL的API函数以DLL的方式引入,在进行封装,使得上手很快,对于普通的渲染来说,足够了,但对于像体渲染这样比较耗时的渲染来讲,我更喜欢直接将渲染部分封装到C/C++的DLL中,C#只负责显示;

linux添加属于自己的shell脚本路径(PATH)[email protected]的博客-程序员秘密_shell 添加path

1、背景自己写的shell脚本,随便放有些乱;不放到PATH路径下,命令只能在脚本所在路径下运行,不能像ls等系统命令可以在任意路径下使用。2、路径的添加方法路径设置参考链接:linux查看和修改PATH环境变量的方法路径添加有很多种,这里选用在当前用户下添加路径,shell脚本命令只能当前用户使用,不影响其他用户。其他模式可以参考以上链接。先在用户目录下创建一个bin文件夹(底下#表示注释)#到用户目录,~表示用户目录cd ~#创建bin文件夹,也可以按自己喜好在指定位

自定义圆形进度条跟随logo及数字进度_周阿宝的博客-程序员秘密

想说最近公司在出一个设计,需要绘制一个圆形进度条,还得要有数字进度,还要求要有动画,当时看到这个,讲真,我是懵逼的。其实之前很少接触到View的绘制这一块,而且很多时候都是利用人家写好的框架,自己直接嵌套使用就OK了,但是我们公司这个,应该是新颖的进度。我没办法找到一模一样的进度条,无奈之下,只好自己来进行绘制了。先给你们看看我们的设计图:     对,就是你们看到的这样,

CToolTipCtrl使用详细解说 _scollins的博客-程序员秘密

<br />摘要:CToolTipCtrl的一般用法和动态改变ToolTip的显示内容的方法及步骤。 <br />    链接:VCHelp: http://www.vchelp.net <br />    CToolTipCtrl使用详细解说 <br />    by 闻怡洋 <br />    ToolTip是Win32中一个通用控件,MFC中为其生成了一个类CToolTipCtrl,总的说来其使用方法是较简单的,下面讲一下它的一般用法和高级用法。 <br />    一般用法步骤: <br />   

随便推点

XRecyclerView 移除的踩坑之路(XRecyclerView 的bug?)_famabb的博客-程序员秘密

最近因为需要上下拉的刷新的功能,又不想重复造轮子,小编特意去找了个第三方的开源lib,现在第三方上下拉刷新的开源lib是非常之多啊,我就不介绍了,反正小编情有独钟的看上了XRecyclerView ,至于为什么,其实是朋友推荐的。。。。。                 XRecyclerView 使用起来还是挺方便的,小编使用的过程,一路溜溜溜的,各种上下拉加载,数据和布

Casper(CSPR)已在Metal Pay上线,进一步整合到现有的商业模式中_唐华斑竹的博客-程序员秘密

我们很高兴能向我们的社区介绍CasperLabs和他们的代币CSPR!作为一家具有大胆想法的区块链公司,CasperLabs致力于在企业层面加快区块链技术的步伐。Casper是做什么的?Casper区块链在设计时结合业务考虑,以可升级的合约和可预测的Gas费为特色。Casper正在寻求让公司更容易地将区块链技术整合到现有的商业模式中。这意味着这是一个易于使用、能抗外部攻击、能够快速有效地扩展的项目。Casper和Metal Pay将CSPR加入Metal Pay将有助于把Casper定位为最易访问.

如何将已下载音乐导入到iPhone的网易云音乐中_SilenceAtNBT的博客-程序员秘密

背景有些音乐是网易云音乐上没有的,即便是花钱也无法得到的,这样一来,如果对于一个只使用单一软件播放音乐的人来说,很坑,怎么办呢?对策既然这样,找找别的方法,其实iTunes本身应该是一个很好用的音乐同步工具,但是,我不知道大家遇没遇到过跟我一样的问题,我总是连接不上,告诉我失败,结果我放弃了,不再使用iTunes。 网易云音乐提供了一个非常好的功能叫#我的音乐云盘#,这个功能Ma...

物联网开发之4G通讯模块_小耿的嵌入式之路的博客-程序员秘密

  在万物互联的物联网时代,物与物之间的连接主要是通过网络进行,网络之间既可以通过网线载体连接也可以通过4G、WIFY等进行无线连接,在无线远距离通讯中目前主要采用的就是4G技术。4G模块是连接物与物的重要载体,是终端设备接入互联网的核心部件,许多新兴市场对4G通信模块的需求都在日益扩大,4G通信模块把频率接收器和信号增幅器等部件全都整合在一起,实现了一体化。  4G模块用的是龙尚4G模块U...

2022年全球市场无线调制解调器总体规模、主要生产商、主要地区、产品和应用细分研究报告_普通网友的博客-程序员秘密

据GIR (Global Info Research)调研,按收入计,2021年全球无线调制解调器收入大约 百万美元,预计2028年达到 百万美元,2022至2028期间,年复合增长率CAGR为 %。同时2020年全球无线调制解调器销量大约 ,预计2028年将达到 。2021年中国市场规模大约为 百万美元,在全球市场占比约为 %,同期北美和欧洲市场分别占比为 %和 %。未来几年,中国CAGR为 %,同期美国和欧洲CAGR分别为 %和 %,亚太地区将扮演更重要角色,除中美欧之外,日本、韩国、印度和东南亚地区,

Java多线程之锁的升级_专业跳大神儿的博客-程序员秘密_多线程锁的升级

Java多线程之锁的升级先说说为什么会有锁升级 因为Sycronized是重量级锁(也是悲观锁),每次在要进行锁的请求的时候,如果当前资源被其他线程占有要将当前的线程阻塞加入到阻塞队列,然后清空当前线程的缓存,等到锁释放的时候再通过notify或者notifyAll唤醒当前的线程,并让其处于就绪状态。这样线程的来回切换是非常消耗系统资源的,而且有的时候,线程刚挂起资源就释放了。而Java的线...

推荐文章

热门文章

相关标签