Python代码风格推荐(谷歌、PEP8)

引言

一直都觉得好的代码风格就像是好看的电脑桌面,一定要简洁并且遵循一定的规范,之前写代码一直觉得有些随意,这样很不好,于是整理了一些实用的规范,以后尽量写一下好的代码。

在Python开发中,也有不同的编程风格规范,和C/C++开发的编程规范一样,Google的编程规范,详细细节参见:

  1. 英文:Google Python Style Guide
  2. 中文:Google Python风格指南

PEP8规范

1.

  1. PEP 8 — Style Guide for Python Code
  2. PEP8中文翻译

命名规范

Names to Avoid 应避免的名字

  1. 永远不要使用字母’l’(小写的L),’O’(大写的O),或者’I’(大写的I)作为单字符变量名。
  2. 在有些字体里,这些字符无法和数字0和1区分,如果想用’l’,用’L’代替。

Class Names 类名

  1. 类名一般使用首字母大写的约定。
  2. 在接口被文档化并且主要被用于调用的情况下,可以使用函数的命名风格代替。
  3. 注意,对于内置的变量命名有一个单独的约定:大部分内置变量是单个单词(或者两个单词连接在一起),首字母大写的命名法只用于异常名或者内部的常量。

Function Names 函数名

  1. 函数名应该小写,如果想提高可读性可以用下划线分隔。
  2. 大小写混合仅在为了兼容原来主要以大小写混合风格的情况下使用(比如 threading.py),保持向后兼容性。

Function and method arguments 函数和方法参数

  1. 始终要将 self 作为实例方法的的第一个参数。
  2. 始终要将 cls 作为类静态方法的第一个参数。
  3. 如果函数的参数名和已有的关键词冲突,在最后加单一下划线比缩写或随意拼写更好。因此 class_ 比 clss 更好。(也许最好用同义词来避免这种冲突)

编程建议

  1. 代码应该用不损害其他Python实现的方式去编写(PyPy,Jython,IronPython,Cython,Psyco 等)。 比如,不要依赖于在CPython中高效的内置字符连接语句 a += b 或者 a = a + b。这种优化甚至在CPython中都是脆弱的(它只适用于某些类型)并且没有出现在不使用引用计数的实现中。在性能要求比较高的库中,可以种 “.join() 代替。这可以确保字符关联在不同的实现中都可以以线性时间发生。
  2. 和像None这样的单例对象进行比较的时候应该始终用 is 或者 is not,永远不要用等号运算符。

另外,如果你在写 if x 的时候,请注意你是否表达的意思是 if x is not None。举个例子,当测试一个默认值为None的变量或者参数是否被设置为其他值的时候。这个其他值应该是在上下文中能成为bool类型false的值。

  1. 使用 is not 运算符,而不是 not … is 。虽然这两种表达式在功能上完全相同,但前者更易于阅读,所以优先考虑。

导入import

  1. 导入通常在分开的行。

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

  3. 导入应该按照以下顺序分组:
  4. 标准库导入
  5. 相关第三方库导入
  6. 本地应用/库特定导入
  7. 你应该在每一组导入之间加入空行。
  8. 推荐使用绝对路径导入,如果导入系统没有正确的配置(比如包里的一个目录在sys.path里的路径后),使用绝对路径会更加可读并且性能更好(至少能提供更好的错误信息)。

注释

  1. 与代码相矛盾的注释比没有注释还糟,当代码更改时,优先更新对应的注释!
  2. 注释应该是完整的句子。如果一个注释是一个短语或句子,它的第一个单词应该大写,除非它是以小写字母开头的标识符(永远不要改变标识符的大小写!)。
  3. 如果注释很短,结尾的句号可以省略。块注释一般由完整句子的一个或多个段落组成,并且每句话结束有个句号。
  4. 在句尾结束的时候应该使用两个空格。
  5. 当用英文书写时,遵循Strunk and White (译注:《Strunk and White, The Elements of Style》)的书写风格。
  6. 在非英语国家的Python程序员,请使用英文写注释,除非你120%的确信你的代码不会被使用其他语言的人阅读。

Block Comments 块注释

  1. 块注释通常适用于跟随它们的某些(或全部)代码,并缩进到与代码相同的级别。块注释的每一行开头使用一个#和一个空格(除非块注释内部缩进文本)。
  2. 块注释内部的段落通过只有一个#的空行分隔。

Inline Comments 行内注释

1.有节制地使用行内注释。

2.行内注释是与代码语句同行的注释。行内注释和代码至少要有两个空格分隔。注释由#和一个空格开始。

3.事实上,如果状态明显的话,行内注释是不必要的,反而会分散注意力。

Documentation Strings 文档字符串

  1. 要为所有的公共模块,函数,类以及方法编写文档说明。
  2. 非公共的方法没有必要,但是应该有一个描述方法具体作用的注释。这个注释应该在def那一行之后。
  3. PEP 257描述了写出好的文档说明相关的约定。特别需要注意的是,多行文档说明使用的结尾三引号应该自成一行。

  4. 对于单行的文档说明,尾部的三引号应该和文档在同一行。

随心随我

Original: https://www.cnblogs.com/ccfco/p/15683650.html
Author: 小筱痕
Title: Python代码风格推荐(谷歌、PEP8)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/604639/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 快速搞懂kafka日志文件体系

    Segment 每个partition又由多个segment file组成 我们说的kafka日志文件就是说的segment,下面我们主要讨论一下segment文件的结构 Segm…

    数据结构和算法 2023年6月7日
    083
  • CF1682F 题解

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据结构和算法 2023年6月12日
    099
  • AtCoder Regular Contest 148 B-dp

    For a string (T) of length (L) consisting of d and p, let (f(T)) be (T) rotated (180) degr…

    数据结构和算法 2023年6月12日
    085
  • Java中高亮字符串中指定的关键字

    本文主要提供一种在字符串中为给定关键字提供拼接高亮标签,该方法支持大小写忽略匹配一下高亮演示网址:www.huhailong.vip 最终效果 ; 实现代码 该方法主要用于在一串字…

    数据结构和算法 2023年6月8日
    098
  • 字符串常见操作

    String的底层结构 而在jdk8中,String的底层是用的字符数组。jdk9里面做了更改,节约String占用的内存。一个char占用两个字节,而程序中绝大多数String只…

    数据结构和算法 2023年6月8日
    0109
  • 蓝桥杯 2014届真题 地宫取宝 动态规划解法

    题目描述 X 国王有一个地宫宝库。是 n x m 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。 地宫的入口在左上角,出口在右下角。 小明被带到地宫的入口,国王要求他只能…

    数据结构和算法 2023年6月7日
    0100
  • 二叉树的遍历 → 不用递归,还能遍历吗

    开心一刻 某同学牙龈发炎去看医生,医生说要动手术 同学说:以前没做过手术,有点紧张 医生说:不用紧张,我也是第一次做手术 听到医生这么说,同学更紧张了 这时候护士走过来,问医生:麻…

    数据结构和算法 2023年6月7日
    092
  • 2022.7.8 并查集+路径压缩

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据结构和算法 2023年6月8日
    090
  • 初识C++01:初探C++

    c++介绍 c++支持面向过程编程(如c),面向对象编程(OOP)和泛型编程; c/c++编译器比较多,window下是微软编译器cl.exe,Linux机下是GCC编译器,mac…

    数据结构和算法 2023年6月12日
    092
  • Petrozavodsk Winter Training Camp 2016: Moscow SU Trinity Contest

    题意:就是问你一个矩阵能由几个行向量表示出来 Solution 其实就是求矩阵的秩,但是会被卡精度(被卡了好几发),直接抄个矩阵求秩的板子就AC了 Code #define CLR…

    数据结构和算法 2023年6月12日
    089
  • 【设计模式】之迭代器模式

    迭代器模式(Iterator pattern):用于顺序访问集合对象里的每一个元素,不用暴露集合是怎样存储元素的。 某个班级有若干个学生,现在需要统计这些学生的平均分数。假设所有学…

    数据结构和算法 2023年6月12日
    087
  • C++ 炼气期之算术运算符

    1. 前言 编写程序时,数据确定后,就需要为数据提供相应的处理逻辑(方案或算法)。所谓逻辑有 2 种存在形态: 抽象&#x5F6…

    数据结构和算法 2023年6月7日
    084
  • 神经网络 CNN 名词解释

    隐藏层 不是输入或输出层的所有层都称为隐藏层. 激活和池化都没有权重 使层与操作区分开的原因在于层具有权重。由于池操作和激活功能没有权重,因此我们将它们称为操作,并将其视为已添加到…

    数据结构和算法 2023年6月16日
    0149
  • github风格规范

    每次提交,Commit message 都包括三个部分 header , body , footer 其中,header 是必须的,body 和 footer 可以省略 不管是哪部…

    数据结构和算法 2023年6月12日
    093
  • AcWing 1800. 不做最后一个! 活用map和vector

    分析:通过读题我们可以知道,这道题其实并不是什么很困难的题,无非就是让我们找到当前产奶量倒数第二小的奶牛,并且特判一下有多头奶牛满足或者没有奶牛满足的情况罢了,这道题的关键在于我们…

    数据结构和算法 2023年6月7日
    086
  • STL

    0. 简介 STL 即标准模板库(Standard Template Library),是 C++ 标准库的一部分,里面包含了一些模板化的通用的数据结构和算法。由于其模板化的特点,…

    数据结构和算法 2023年6月12日
    078
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球