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

  

posted @ 2021-10-21 21:33  %女王%  阅读(685)  评论(0编辑  收藏  举报