小豹子的网络记事本

记录每一个有意思的细节

Python - 部分PEP8规范

写代码就像写字一样,为什么有的人写的字十分漂亮,而有的人写的字过后连自己都不认识,最主要还是从一开始是否对自己严格要求。从现在开始就当自己是个初学者,把代码写漂亮点。以下截取了部分PEP8代码规范,里面掺杂了一些个人中文注解。
想看英文原版,就点击 https://legacy.python.org/dev/peps/pep-0008/
想看中文翻译版,就点击 https://blog.csdn.net/ratsniper/article/details/78954852

 

缩进


# 函数参数应垂直对齐

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) 

                       
# 使用更多的缩进,与其它行分开 

Yes:                        
def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)

No:    
def long_function_name(
    var_one, var_two, var_three,
    var_four):
    print(var_one) 

 

# 阔号后面换行需要增加缩进   

Yes:        
foo = long_function_name(
    var_one, var_two,
    var_three, var_four)

 

Yes:
以下三种都行   
if条件换行不增加额外的空格

if (this_is_one_thing and
    that_is_another_thing):
    do_something()

 

# 增加一个注释,在能提供语法高亮的编辑器中可以有一些区分

if (this_is_one_thing and
    that_is_another_thing):
    # Since both conditions are true, we can frobnicate. 
    do_something()

 

# if条件换行增加额外的空格

if (this_is_one_thing
        and that_is_another_thing):
    do_something()

 

Yes:
以下四种都行
对于闭括号,可以跟参数保持对齐,像前两种;也可以跟变量保持对齐,像后两种

my_list = [
    1, 2, 3,
    4, 5, 6,
    ]
    
result = some_function_that_takes_arguments(
    'a', 'b', 'c',
    'd', 'e', 'f',
    )
    
my_list = [
    1, 2, 3,
    4, 5, 6,
]

result = some_function_that_takes_arguments(
    'a', 'b', 'c',
    'd', 'e', 'f',
) 


# 代码的宽度应该限制在79个字符内,较长的代码行选择在小括号,中括号以及大括号中的隐式续行方式。这种方式应该优先使用,而不是使用反斜杠续行。
# 但反斜杠有时依然很有用。比如,比较长的,多个with状态语句,不能使用隐式续行,所以反斜杠是可以接受的   

with open('/path/to/some/file/you/want/to/read') as file_1, \
     open('/path/to/some/file/being/written', 'w') as file_2:
    file_2.write(file_1.read()) 

 

# 运算符应该在换行的前面   
Yes:    

income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)

 

No:

income = (gross_wages +
          taxable_interest +
          (dividends - qualified_dividends) -
          ira_deduction -
          student_loan_interest)   

 

空行

         
# 顶层的类或函数用两个空行隔开,类里面的方法用一个空行隔开,以下为示例

class xxx(object):
        pass


class yyy(object):
    """
    comment
    """
    def a(self): # comment
        """ comment """
        pass

    def c(self): # comment
        """ comment """
        pass       

 

导入

   
# 不要一行导入多个模块
Yes:

import os
import sys

No: 

import sys, os  

 
# 但是可以这样   

from subprocess import Popen, PIPE    


导入总是位于文件的顶部,在模块注释和文档字符串之后,在模块的全局变量与常量之前。
导入应该按照以下顺序分组:
标准库导入
相关第三方库导入
本地应用/库特定导入
你应该在每一组导入之间加入空行  
    
导入尽量使用绝对路径

import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example  


显示的指定相对导入路径是使用绝对路径的一个可接受的替代方案,特别是在处理使用绝对路径导入不必要冗长的复杂包布局时。相对路径导入注意事项https://www.cnblogs.com/hhh5460/p/6681601.html    

from . import sibling  #加载当前目录下的sibling.py文件
from .sibling import example  #加载当前目录下sibling.py的example    

 

双下划线的变量应出现在导入前,但除了from __future__ imports

"""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

 

引号


在Python中,单引号和双引号字符串是相同的。PEP不会为这个给出建议。选择一条规则并坚持使用下去。当一个字符串中包含单引号或者双引号字符的时候,使用和最外层不同的符号来避免使用反斜杠,从而提高可读性。
对于三引号字符串,总是使用双引号字符来与PEP 257中的文档字符串约定保持一致。

 

空格


紧跟括号不要有空格
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:
ham[1:9], ham[1:9:3], ham[:9:3], ham[1::3], ham[1:9:]
ham[lower:upper], ham[lower:upper:], ham[lower::step]
ham[lower+offset : upper+offset]
ham[: upper_fn(x) : step_fn(x)], ham[:: step_fn(x)]
ham[lower + offset : upper + offset]

No:
ham[lower + offset:upper + offset]
ham[1: 9], ham[1 :9], ham[1:9 :3]
ham[lower : : upper]
ham[ : upper]

紧贴在函数参数的左括号之前
Yes: spam(1)
No:  spam (1)

紧贴索引或者切片的左括号之前
Yes: dct['key'] = lst[index]
No:  dct ['key'] = lst [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()

 

注释


注释开头的单词首字母大写,一般使用#加一个空格开头
行内注释一般与代码隔开两个空格

 

命名规范


模块应该用简短全小写的名字,如果为了提升可读性,下划线也是可以用的。Python包名也应该使用简短全小写的名字,但不建议用下划线。
类名应该用首字母大写的名字
异常名,因为异常一般都是类,所有类的命名方法在这里也适用。然而,你需要在异常名后面加上“Error”后缀
函数名应该小写,如果想提高可读性可以用下划线分隔
普通变量全小写和_,常量用全大写和_

函数和方法参数
始终要将self作为实例方法的的第一个参数。
始终要将cls作为类静态方法的第一个参数。
如果函数的参数名和已有的关键词冲突,在最后加单一下划线比缩写或随意拼写更好。因此class_比clss更好。

posted @ 2019-05-27 14:54  小豹子加油  阅读(198)  评论(0编辑  收藏  举报