让你的python代码更优雅(pythonic)—— 基于PEP8

时间:2022-05-28 06:57:51

  写出优雅的代码,自己调试bug更加容易,也便于别人查看,下面谈谈一下让代码更加优雅的写法,主要是基于 PEP8。
  
1,缩进与换行,每级缩进使用4个空格。

# yes:
# 续行与其包裹元素要对齐
foo = long_function_name(var_one, var_two,
                         var_three, var_four)

# No:
# 这种就不好
foo = long_function_name(var_one, var_two,
    var_three, var_four)

2,限制所有行的最大长度为 79 个字符。

3,空行。
  顶层函数和类之间使用两个空行。
  类的方法之间使用一个空行。
  在函数中使用空行来表示不同的逻辑段落。

4,导入通常应当使用单独的行。

# Yes:
import os
import sys

# No: 
import sys, os

但是可以这么做:
from subprocess import Popen, PIPE

  导入总是位于文件的顶部,在模块注释和文档字符串之后,在模块的全局变量与常量之前。
  导入应该按照以下的顺序分组:
    standard library imports 标准库导入
    related third party imports 相关第三方导入
    local application/library specific imports 本地应用程序/库的特定导入
  每组导入之间使用空行隔开。
  从一个包含类的模块中导入类时,常常这么写:
    from myclass import MyClass
    from foo.bar.yourclass import YourClass
    
5,下面的情况,避免多余空格。
  紧贴着圆括号、方括号和花括号:

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: dict['key'] = list[index]
No:  dict ['key'] = list [index]

  在赋值(或其他)语句的运算符周围,不要为了对齐而使用多个空格。

Yes: 
x = 1
y = 2
long_variable = 3

No:
x             = 1
y             = 2
long_variable = 3

  总是在这些二元运算符前后加一个空格:赋值(=),自增赋值(+=,-= 等等), 比较(==,<,>,!=,<>,<=,>=,in,not in,is,is not),布尔运算(and,or,not)。
  在算术运算符前后加空格:

Yes:
i = i + 1
submitted += 1
x = x * 2 - 1
hypot2 = x * x + y * y
c = (a + b) * (a - b)

No:
i=i+1
submitted +=1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)

  不要在一个关键字参数或者一个缺省参数值的 = 符号前后加一个空格。

Yes:
def complex(real, imag=0.0):
    return magic(r=real, i=imag)

No:
def complex(real, imag = 0.0):
    return magic(r = real, i = imag)

  通常不推荐使用复合语句(一行代码中有多条语句)。

Yes:
if foo == 'blah':
    do_blah_thing()
do_one()
do_two()
do_three()

No:
if foo == 'blah': do_blah_thing()
do_one(); do_two(); do_three()

6,注释
  不好理解的注释不如没有注释。注释要和代码保持与时俱进!
  注释应该是一条完整的句子。如果注释是一个短语或句子,它的第一个字应该大写,除非它是一个小写字母开头的标识符(绝对不要改变标识符的大小写)。
  如果注释很短,那么结尾的句号可以省略。块注释通常由一个或多个段落组成, 这些段落由完整的句子构成,每个句子都应该使用句号结尾。
  句号结尾的句子后面应该有2个空格。
  来自非英语国家的Python程序员:请使用英语写注释,除非你120%肯定你的代码将永远不会 被不说你的语言的人阅读。

7,命名规范。
  永远不要使用 ‘l’(小写的L),’O’(大写的O),或者’I’(大写的I)作为单字变量名。
  毫无例外,类名要用首字母大写的规则。内部类,要加上前导下划线。
  函数名应该用小写,为了增加可读性可以用下划线分隔。
  使用函数命名规则:使用下划线分隔的小写字母会提高可读性。

8,其他。
  别用‘==’进行布尔值和 True 或者 False 的比较

Yes:  if greeting:
No:  if greeting == True: