美文网首页
python拾遗8 - PEP 8

python拾遗8 - PEP 8

作者: 天命_风流 | 来源:发表于2020-05-05 17:33 被阅读0次

缩进规范

  • 使用 4 个空格进行缩进,而不是 tab。
  • 每行的长度限制在 79 字符以内

空行规范

  • 全局的类、函数 的上方需要两个空行,类的函数之间需要一个空行。
  • 函数内部根据代码逻辑也可以添加空行,但是最多一行。

空格规范

  • 逗号 和 冒号 后面要添加一个空格。
  • 注释 # 的前面添加两个空格,后面添加一个空格。
  • 操作符,如 +,-,*,/,==,!=,等前后都要添加空格。

换行规范

  • 当一行代码超过 79 字符,我们要进行换行。
  • 在括号内的长参数可以直接换行,注意括号对齐。
  • 使用换行符实现换行。

import 规范

  • 所有的 import 放在开头。
  • 一行导入一个模块。
  • 尽量导入模块或者文件,而不要导入一个函数,因为这可能导致命名冲突。

注释规范

  • 对于较大的逻辑块,可以在其上面一行用 # 添加注释,
  • 像写作文一样写你的注释,包括:标点规范、语法正确、表意清晰、重点突出 等。
  • 并不是很推荐行注释。

文档描述

  • 描述一个类或者函数的作用,写在包含 class/def 语句的下一行。
  • 使用 三个双引号 开始和结尾。
  • 用一句话概括主要内容。
  • 用一段话详细解释。
  • 参数列表,参数格式,返回值格式。

命名规范

  • ”计算机科学有两大难事:缓存失效 和 命名。“
  • 拒绝毫无意义的单字符,除了使用 for i in range(10),这种迭代情况。
  • 变量名:小写单词,下划线连接。如:data_format 。如果是私有变量,在前方添加两个下划线。
  • 常量:全部大写,下划线连接。如:WAIT_TIME
  • 函数名:小写单词,下划线连接。
  • 类名:首字母大写,直接拼接。如:class SpatialDropout2D( )

代码拆分

  • 这不是 PEP 8 规范,但是会有助于阅读。
  • 将多个循环嵌套拆开:
def send(money):
    if is_server_dead:
        LOG('server dead')
        return
    else:
        if is_server_timed_out:
            LOG('server timed out')
            return
        else:
            result = get_result_from_server()
            if result == MONEY_IS_NOT_ENOUGH:
                LOG('you do not have enough money')
                return
            else:
                if result == TRANSACTION_SUCCEED:
                    LOG('OK')
                    return
                else:
                    LOG('something wrong')
                    return

拆为:

def send(money):
    if is_server_dead:
        LOG('server dead')
        return

    if is_server_timed_out:
        LOG('server timed out')
        return

    result = get_result_from_server()

    if result == MONET_IS_NOT_ENOUGH:
        LOG('you do not have enough money')
        return

    if result == TRANSACTION_SUCCEED:
        LOG('OK')
        return

    LOG('something wrong')
  • 将不同功能的逻辑拆成多个函数。
    例如:一段二分查找的代码:
def solve(arr, target):
    l, r = 0, len(arr) - 1
    ret = -1
    while l <= r:
        m = (l + r) // 2
        if arr[m] * arr[m] > target:
            ret = m
            r = m - 1
        else:
            l = m + 1
    if ret == -1:
        return -1
    else:
        return arr[ret]


print(solve([1, 2, 3, 4, 5, 6], 8))
print(solve([1, 2, 3, 4, 5, 6], 9))
print(solve([1, 2, 3, 4, 5, 6], 0))
print(solve([1, 2, 3, 4, 5, 6], 40))

拆为:

def comp(x, target):
    return x * x > target


def binary_search(arr, target):
    l, r = 0, len(arr) - 1
    ret = -1
    while l <= r:
        m = (l + r) // 2
        if comp(arr[m], target):
            ret = m
            r = m - 1
        else:
            l = m + 1
    return ret


def solve(arr, target):
    id = binary_search(arr, target)

    if id != -1:
        return arr[id]
    return -1


print(solve([1, 2, 3, 4, 5, 6], 8))
print(solve([1, 2, 3, 4, 5, 6], 9))
print(solve([1, 2, 3, 4, 5, 6], 0))
print(solve([1, 2, 3, 4, 5, 6], 40))
  • 类的拆分:根据类的意义拆分为多个类。
    例如:
class Person:
    def __init__(self, name, sex, age, job_title, job_description, company_name):
        self.name = name
        self.sex = sex
        self.age = age
        self.job_title = job_title
        self.job_description = description
        self.company_name = company_name

拆为:

class Person:
    def __init__(self, name, sex, age, job_title, job_description, company_name):
        self.name = name
        self.sex = sex
        self.age = age
        self.job = Job(job_title, job_description, company_name)

class Job:
    def __init__(self, job_title, job_description, company_name):
        
        self.job_title = job_title
        self.job_description = description
        self.company_name = company_name

相关文章

网友评论

      本文标题:python拾遗8 - PEP 8

      本文链接:https://www.haomeiwen.com/subject/yuamghtx.html