python编程规范

python编程规范

缩进

  • 每一级缩进使用4个空格

  • 续行应该与其包裹元素对齐,要么使用括号内的隐式行连接来垂直对齐,要么使用挂行缩进对齐

  • 用挂行缩进时,应该考虑到第一行不应该有参数,以及使用缩进以区分自己是续行

 # 与左括号对齐
 foo = long_function_name(var_one, var_two,
                          var_three, var_four)
 
 # 用更多的缩进来与其他行区分
 def long_function_name(
         var_one, var_two, var_three,
         var_four):
     print(var_one)
 
 # 挂行缩进应该再换一行
 foo = long_function_name(
     var_one, var_two,
     var_three, var_four)
 
 # 在条件判断的语句添加额外的缩进
 if (this_is_one_thing
         and that_is_another_thing):
     do_something()

空格是首选的缩进方式,直接禁止使用tab键

换行

 # 推荐:运算符和操作数很容易进行匹配
 income = (gross_wages
           + taxable_interest
           + (dividends - qualified_dividends)
           - ira_deduction
           - student_loan_interest)
  • 顶层函数和类的定义,前后用两个空行隔开。

  • 类里的方法定义用一个空行隔开。

  • 相关的功能组可以用额外的空行(谨慎使用)隔开。

Imports 导入

  • 导入总是位于文件的顶部,在模块注释和文档字符串之后,在模块的全局变量与常量之前。

    导入应该按照以下顺序分组:

    1. 标准库导入

    2. 相关第三方库导入

    3. 本地应用/库特定导入

    4. 你应该在每一组导入之间加入空行。

  • 推荐使用绝对路径导入

  • 避免通配符的导入(from import *)

 

模块级的“呆”名

“呆名“(名字里有两个前缀下划线和两个后缀下划线)必须出现在除文档字符串之外的其他代码之前。

 """This is the example module.
 
 This module does stuff.
 """
 
 from __future__ import barry_as_FLUFL
 
 __all__ = ['a', 'b', 'c']
 __version__ = '0.1'
 __author__ = 'Cardinal Biggles'
 
 import os
 import sys

表达式和语句中的空格

在下列情况下,避免使用无关的空格:

  • 紧跟在小括号,中括号或者大括号后

  • 紧贴在逗号、分号或者冒号之前

  • 紧贴在函数参数、索引、切片的左括号之前

 Yes: spam(ham[1], {eggs: 2})
 No:  spam( ham[ 1 ], { eggs: 2 } )
 
 Yes: if x == 4: print x, y; x, y = y, x
 No:  if x == 4 : print x , y ; x , y = y , x
         
 Yes: spam(1)
 No:  spam (1)
     
 Yes: dct['key'] = lst[index]
 No:  dct ['key'] = lst [index]

其他建议

  • 避免在尾部添加空格。

  • 总是在二元运算符两边加一个空格:赋值(=),增量赋值(+=,-=),比较(==,<,>,!=,<>,<=,>=,in,not,in,is,is not),布尔(and, or, not)。

  • 如果使用具有不同优先级的运算符,请考虑在具有最低优先级的运算符周围添加空格。有时需要通过自己来判断;但是,不要使用一个以上的空格,并且在二元运算符的两边使用相同数量的空格。

  • 在制定关键字参数或者默认参数值的时候,不要在=附近加上空格。

  • 功能型注释应该使用冒号的一般性规则,并且在使用->的时候要在两边加空格。

 # √
 i = i + 1
 submitted += 1
 x = x*2 - 1
 hypot2 = x*x + y*y
 c = (a+b) * (a-b)
 
 def complex(real, imag=0.0):
     return magic(r=real, i=imag)
 
 # ×
 def complex(real, imag = 0.0):
     return magic(r = real, i = imag)

注释

  • 若注释很短,结尾的句号可以省略。块注释一般由完整句子的一个或多个段落组成,且每句话结束有个句号。

  • 在句尾结束的时候应该使用两个空格。

  • 块注释通常适用于跟随它们的某些(或全部)代码,并缩进到与代码相同的级别。

  • 有节制地使用行内注释。行内注释是与代码语句同行的注释。行内注释和代码至少要有两个空格分隔。注释由#和一个空格开始。

  • 多行文档说明使用的结尾三引号应该自成一行。

     """Return a foobang
     
     Optional plotz says to frobnicate the bizbaz first.
     """
  • 对于单行的文档说明,尾部的三引号应该和文档在同一行。

命名约定

  • 类名首字母大写

  • 函数名应小写,若想提高可读性,可用下划线分隔

  • 始终要将 self 作为实例方法的的第一个参数

  • 始终要将 cls 作为类静态方法的第一个参数

  • 如果函数的参数名和已有的关键词冲突,在最后加单一下划线比缩写或随意拼写更好。因此 class_ 比 clss 更好。(也许最好用同义词来避免这种冲突)

  • 使用下划线分隔小写单词以提高可读性

  • 常量通常定义在模块级,通过下划线分隔的全大写字母命名。例如: MAX_OVERFLOW 和 TOTAL

公共和内部的接口

  • 模块应该使用__all__属性显式地在它们的公共API中声明名称。将__all__设置为空列表表示模块没有公共API。

  • 即使通过__all__设置过,内部接口(包,模块,类,方法,属性或其他名字)依然需要单个下划线前缀。

编程建议

  • 和像None这样的单例对象进行比较的时候应该始终用 is 或者 is not,永远不要用等号运算符

  • 始终使用def表达式,而不是通过赋值语句将lambda表达式绑定到一个变量上

     # √
     def f(x): return 2*x
     
     # ×
     f = lambda x: 2*x
  • 返回的语句保持一致。函数中的返回语句都应该返回一个表达式,或者都不返回。如果一个返回语句需要返回一个表达式,那么在没有值可以返回的情况下,需要用 return None 显式指明,并且在函数的最后显式指定一条返回语句(如果能跑到那的话)。

     # √
     def foo(x):
         if x >= 0:
             return math.sqrt(x)
         else:
             return None
     
     def bar(x):
         if x < 0:
             return None
         return math.sqrt(x)
     
     # ×
     def foo(x):
         if x >= 0:
             return math.sqrt(x)
     
     def bar(x):
         if x < 0:
             return
         return math.sqrt(x)
  • 使用字符串方法代替字符串模块

  • 使用 ”.startswith() 和 ”.endswith() 代替通过字符串切割的方法去检查前缀和后缀

  • 对象类型的比较应该用isinstance()而不是直接比较type

     正确: if isinstance(obj, int):
     
     糟糕: if type(obj) is type(1):
  • 不要用 == 去和True或者False比较

     正确: if greeting:
     糟糕: if greeting == True:
     更糟: if greeting is True:
  •  

原文地址:https://www.cnblogs.com/wonker/p/13301487.html