python编码规范
python编码规范(PEP8)
1、缩进
1)每一级缩进使用4个空格
2)续行应该与其包裹元素对齐,要么使用圆括号,方括号和花括号内的隐式行连接来垂直对齐要么使用挂行缩进对齐。当使用挂行缩进时,应该考虑到第一行不应该有参数,以及使用缩进以区分自己是续行。
a、对齐缩进(左边括号对齐)
b、悬挂缩进
c、层级缩进
d、不推荐的缩进
2、行的最大长度
1)所有行限制的最大字符数为79.
2)没有结构化限制的大块文本(文档字符或者注释),每行的最大字符数限制在72.
3)换行如下
3、空行
1)顶层函数和类的定义,前后用两个空行隔开
2)类里的方法定义用一个空行隔开
4、注释
1)与代码相矛盾的注释比没有注释还糟,当代码更改时,优先更新对应的注释!
2)注释应该时完整的句子。如果一个注释时一个短语或句子,它的第一个单词应该大写,除非它是以小写字母开头的标识符(永远不要改变标识符的大小写!)。
如果注释很短,结尾的句号可以省略。块注释一般由完整句子的一个或多个段落组成,并且每句话结束有个句号。在句尾结束的时候应该使用两个空格。在非英语国家的Python程序员,请使用英文写注释,除非你120%的确信你的代码不会被使用其他语言的人阅读
3)块注释
a、块注释通常适用于跟随他们的某些(或全部)代码,并缩进到与代码相同的级别。块注释的每一行开头使用一个#和一个空格(除非块注释内部缩进文本)。
b、块注释内部的段落通过只有一个#的空行分隔
4)行内注释
a、有节制地使用行内注释
b、行内注释是与代码语句同行的注释。行内注释和代码至少要有两个空格分隔。注释由#和一个空格开始。
5)文档字符串
a、要为所有的公共模块,函数,类以及方法编写文档说明。
b、非公共的方法没有必要,但是应该有一个描述方法具体作用的注释。这个注释应该在def那一行之后
c、PEP_257描述了写出好的文档说明相关的约定。特别需要注意的是,多行文档说明使用的结尾三引号应该自成一行,例如:'''文档字符串'''
6)模块的文档字符串注释
a、模块顶部三引号包起来的内容
b、在这个注释中 通常是用来描述整个模块的功能(输出查看:print(模块.__doc__))
c、类的文档字符串注释(类里面三引号包起来的内容、在这个注释中,描述类的功能:输出查看print(类.__doc__))
d、函数级别的文档字符串注释(
自动添加参数,描述每个参数的描述、
描述整个函数的功能
输出查看print(函数.__doc__))
e、对于单行的文档说明,尾部的三引号应该和文档在同一行
5、命名约定
a、变量命名
永远不要使用字母'l'(小写的L),‘O’(大写的O),或者"I"(大写的I)作为单字符变量名。
在有些字体里,这些字符无法和数字0和1区分,如果想用"l",用"L"代替
b、函数命名
函数名应该小写,如果想提高可读性可以用下划线分隔
大小写混合仅在为了兼容原来主要以大小写混合风格的情况下使用(比如threading.py),保持向后兼容性
c、类命名
类名一般使用首字母大写的约定
在接口被文档化并且主要被用于调用的情况下,可以使用函数的命名风格代替。
注意,对于内置的变量名有一个单独的约定:大部分内置变量是单个单词(或者两个单词连接在一起),首字母大写的命名法只用于异常名或者内部的常量
d、类里面函数和方法参数
始终要将self作为实例方法的第一个参数
始终要将cls作为类方法的第一个参数
如果函数的参数名和已有的关键词冲突,在最后加单一下划线比缩写或随意拼写更好。因此class_比clss更好。
6、字符串引号
单引号和双引号字符串是相同的。PEP不会为这个给出建议。选择一条规则并坚持使用下去。当一个字符串包含单引号或者双引号字符的时候,使用和最外层不同的符号来避免使用反斜杠,从而提高可读性
7、模块和包导入规范
1)命名规范
模块名称要短、使用小写,并避免使用特殊符号,比如点(.)和问号(?)
因此请尽量保持模块名称简单,以无需分开单词(不推荐在两个单词之间使用下划线)
2)模块导入建议
- 差:from modu import *:可读性差、全部导入,使用的时候方便,但是不知道引用的是否为该模块的一部分、或是内建函数或者上文定义的?
- 稍好:from modu import sqrt:x = sqrt(4)如果在import语句与这条语句之间,sqrt没有被重复定义,它也行是模块modu里的某个函数
- 最好的做法:import modu:x = modu.sqrt(4) # sqrt显然是属于模块modu的
- 推荐:import os
import sys
- 不推荐:import sys,os
- 也可以:from subprocess import Popen,PIPE
- 尽量不要使用这种方式导入:from modu1 import *
- __all__变量:如果模块中存在全局变量__all__,那么通过from XXX import * 导入该模块时只会导入__all__变量中指定的方法和变量,没有的话默认全部导入
- 模块.py
__all__= ['name','func1']
from 模块 import *
print(name)
print(func1())
可访问name和func1,模块.py中的其他不能访问
- 包
1)任意包含__init__.py文件的目录都被认为是一个Python包
2)因为导入包时会首先执行包下init.py这个文件
3)包中init文件中__all__变量的作用
__init__文件中存在全局变量__all__,通过from xxx import * 导入时也只会导入__all__变量中制定的模块,没有的话默认全部导入
4)Python提供非常简单的包管理系统,即简单地将模块管理机制扩展到一个目录上(目录扩展为包),任意包含__init__.py文件的目录都被认为是一个Python包。导入一个包里不同模块的方式和普通的导入模块方式相似,特别的地方是__init__.py 文件将集合所有包范围内的定义。
5)pack/目录下的modu.py文件通过import pack.modu语句导入。该语句会在pack目录下寻找__init__.py文件,并执行其中所有顶层语句。以上操作之后,modu.py内定义的所有变量、方法和类在pack.modu命名空间中均可看到。
6)一个常见的问题是往__init__.py中加过多代码,随着项目的复杂度增长,目录结构越来越深,子包和更深嵌套的子包可能会出现。在这种情况下,导入多层嵌套的子包中的某个部件需要执行所有通过路径里碰到的__init__.py文件。如果包内的模块和子包没有代码共享的需求,使用空白的__init__.py文件是正常甚至好的做法
7)最后,导入深层嵌套的包可用这个方便的语法:import very.deep.module as mod。该语法允许使用mod替代冗长的very.deep.module
本文来自博客园,作者:%女王%,转载请注明原文链接:https://www.cnblogs.com/lynne-wu/p/15371815.html