Google | Python编程规范指南

简介: 优秀的代码,不仅仅是实现一个项目、一项功能那么简单,它不仅包含精妙的软件设计模式,还需要依托良好的语言和风格规范。依照编程语言的规范,不仅能够提升代码的可阅读性,还可以提升代码的可靠性,避免因为疏忽细节而造成的不必要错误。本文就结合《Google开源项目风格指南》和日常使用,来抽取出一些比较有用的Python语言规范和风格规范,希望对各位有所帮助。

前言

我在前面很多文章中提及过,好的代码绝不仅仅包含能够实现一个项目、一个功能那么简单。在开发一个系统的过程中需要重点考虑代码的可复用性、设计模式,这样能够让后期维护变的更加方便简单。

除了高级的设计模式之外,编程过程中规范的代码也是至关重要的,它不仅能够让周围同事更加容易的阅读和理解、提高团队合作效率,此外,还可以避免因为不规范而造成的细节错误,举个例子,多线程之间存在变量共享问题,如果在写代码时考虑不周到会引起变量的重复写入,进而造成一系列不容被发现的问题。因而,保证良好的开发规范,能够减少很多容易疏忽的错误,为后期代码调试减少很多不必要的工作量。

本文首先介绍一些常用的Python代码分析工具pylint,然后结合《Google开源项目风格指南》提炼、介绍一下Python开发需要着重注意的一些语言规范。

pylint

简介

pylint是一款Python代码分析工具,在企业项目开发部署中,也常用作代码规范的代码的静态检查例如,变量名称格式是否正确检查代码长度等,它的主要功能可以分为如下几个方面:

  • 代码规范
  • 错误检测
  • 协助重构
  • 持续集成
  • ……

其中较为常用的就是代码规范和错误检测,能够按照PEP8编程风格指导对代码进行静态检查,并提示哪里有错误?哪里不够规范?

使用

第一步:首先需要需要按照pylint,

$ pip install pylint

第二步:生成默认配置文件,

$ pylint --persistent=n --generate-rcfile > pylint.conf

然后会生成一个pylint.conf文件,主要包含pylint的一些配置项,这一块可以忽略。

第三步:代码分析

pylint可以单独分析一个文件,也可以分析当前目录下所有子目录的文件,

分析单个文件,

$ pylint test.py

检查、分析单个文件它会详细的列出4个等级的信息报告,分别是,

  • convention
  • refactor
  • warning
  • error

也可以分析整个目录下所有文件,

$ pylint directory_name/

确认后会详细的列出每一个出问题的地方,已经出现了什么问题。

经过pylint的代码分析之后,可以按照它的提示进行修改代码规范,能够极大的提高代码质量。由于pylint是一款很优秀的Python代码静态分析工具,目前很多知名的开发工具都已经集成或者通过简单的配置拥有pylint的功能,例如,pycharm、vscode等。

Google开源项目风格指南

pylint有很多优点,

  • 检查速度快
  • 使用简单
  • 分析深入
  • ……

但是它也有一些不足之处,例如,它严格的按照PEP8进行规范,有很多是不必要的告警,pylint提示的信息过多,这样会无从下手,我们要选择性的抑制或者忽略告警信息。

在很多知名的大企业中都有一套自己的代码开发规范,当然它们很多地方都是有相同之处的,而不是天壤之别的差异。

提高这里就引出了这一节的主角--Google,我们都知道Google是开源社区的主要贡献者之一,它们开源了很多知名且优质的项目,例如,近两年比较火的TensorFlow。它们在开源项目中针对不同语言都有一套明确的风格指南,本文从《Google开源项目风格指南》中提炼出一些比较有价值的Python编程规范,希望能够对各位在Python开发中有所帮助。

Python语言规范

  • 导入包:使用模块全路径来导入包,这样能够避免模块名称相同而造成的冲突
  • 异常处理:首先,raise抛出异常抛出异常时应该使用已有的异常类或者自定义异常类,例如,raise MyException("Error message"),避免抛出一串不知所云的字符串,例如,raise "Error message"。其次,用except捕获异常时避免使用Exception这类泛泛的异常。以上两点主要为了帮助后期调试,能够清楚抛出的什么类型的异常,捕获了什么样的错误,有助于调试。
  • 全局变量:尽量避免使用全局变量,可以用类变量替代。
  • 列表推导:在简单的情况下鼓励使用列表推导式,复杂的情况下避免使用列表推导式,难以阅读,例如,下方,映射表达式, for语句, 过滤器表达式中简单的情形可以用一行列表推导式代替多行代码。
result = []
for x in range(10):
    result.append(x * x)
result = [x ** 2 for x in range(10)]
  • 生成器:生成器可以有效的节省内存占用情况,可以按需使用生成器。
  • 默认参数值:定义一个函数式,我们为了应对某些特例情况而添加几个参数,但是大多数情况下是用不到的,我们可以采用默认参数值的方式应对这些特例调用问题,这里需要注意,默认参数值不要使用可变对象,例如,列表、字典等。
  • True/False的求值:尽量的使用隐式false,在Python中把所有的“空”值,例如,0、None、[]、{}都被认为是false,我们在获取这些返回值时可以用隐式的false,例如,返回的foo是一个空列表,我们可以用if foo:来判断它是否为“空”,而不是if foo==[]:,这样不仅更加易读,而且能够避免犯错。
  • 过时的语言特性:在很多代码里面习惯于使用filter、map、reduce这类语言特性,尽可能使用列表推导或者for循环替代。

以上介绍的是Python在语言方面的规范,也就是说不用这种方式也可以同样实现对应的功能,但是通过上述语言规范能够更多的避免细微之处带来的错误,下面就来介绍一下Python风格规范

Python风格规范

首先来看一下风格这个词汇的概念,

风格是指具有独特于其他人的表现,打扮,行事作风等行为和观念。

也就是说它是一个个性化的概念,对于Python编程,每个人都有自己的风格,你可以按照自己独特的风格去编写代码,这样不会像语言规范那么严格,疏忽之处容易造成错误。Python风格规范更侧重于代码阅读中的地位,良好的风格规范能够让代码更加容易阅读,能够对团队协作、后期维护提供强有力的支撑。

  • 行长度代码行长度不要超过80使用过Pycharm的应该都知道,它有一个代码长度指引线,也就是说按照代码风格规范不要超过这个长度,但是pycharm默认的代码长度是120,这里有一些误导人,在很多大型公司这个数值应该设定为79。pycharm可以通过Editor->Code Style进行修改,vscode可以通过editor.rulers进行设定修改。
  • 括号尽量少使用括号,尤其是在条件语句、返回语句中。
  • 空行顶级定义,例如,函数、类定义之间空两行,类定义和第一个方法、其他方法之间空一行。
  • 空格第一,括号内不要使用空格;第二,不要在逗号、冒号、分号前面加空格,应该在它们后面加上空格;第三、运算符两边加空格。
  • Shebang不要纠结于这个词的含义,它只是一种用法,具体而言,在main主文件前加上#!/usr/bin/python2,或者#!/usr/bin/python3,这是由于#!能够帮助内核找到Python解释器,当然,这只有在执行文件中才有必要,默认main为执行文件。
  • 类继承如果定义的类不从其他类继承,可以显式的从object继承,也就是说用class Sample(object):,而不是class Sample:
  • 字符串避免使用+或者+=累加字符串,由于字符串是不可变对象,如果这样累加会导致创建不必要的临时对象,非线性的增加运行时间。
  • 文件和sockets在文件和sockets结束时,应该显式的关闭它,这里推荐使用with语句,这样就避免重复的写关闭语句,也防止遗忘编写关闭语句。
with open("test.log", 'r') as fp:
    lines = fp.readlines()
  • TODO注释我在前面介绍vs code的文章中提到了TODO注释,这是一个良好的习惯,对临时代码进行TODO注释或者FIXME注释,能够很容易定位到即将解决的问题所在处。
  • 导入模块格式每个导入应该独占一行。
# 正确
import os
import sys
# 错误
import os, sys
  • 命名第一、模块名、包名称、方法名、函数名、实例变量名、函数参数名、局部变量名这些应该使用小写字母加下划线的方式,例如,function_name第二、类名、自定义异常名,应该采用驼峰的命名方式,例如,ClassName第三、全局变量名应该使用大写字母加下划线的方式,例如,GLOBAL_VAL_NAME
注意,Python没有像Java、C++这些严格的受保护变量和私有变量的概念,但是有一些约定成熟的使用方式,例如单下划线(_)用于表示模块变量或者protected变量。双下划线(__)表示实例变量或者类的私有变量。

下面有Python之父Guido推荐的语言规范,

Type Public Internal
Modules lower_with_under _lower_with_under
Packages lower_with_under
Classes CapWords _CapWords
Exceptions CapWords
Functions lower_with_under() _lower_with_under()
Global/Class Constants CAPS_WITH_UNDER _CAPS_WITH_UNDER
Global/Class Variables lower_with_under _lower_with_under
Instance Variables lower_with_under _lower_with_under (protected) or __lower_with_under (private)
Method Names lower_with_under() _lower_with_under() (protected) or __lower_with_under() (private)
Function/Method Parameters lower_with_under
Local Variables lower_with_under
  • Main:main文件一般用于执行文件,但是这个文件也应该是可以在其他地方导入的,因此需要在main文件中加入if name__ == '__main',这样当直接执行时可以运行主程序,当导入时则不会运行。

结语

上述主要根据《Google开源项目风格指南》提取、总结了一些常用的Python语言规范和风格规范,养成的良好的开发习惯,能够大大减少开发过程中遇到的问题,也许在刚开始去尝试记忆这些事会觉得非常繁琐,但是久而久之、潜移默化之中就养成了这样的习惯,这样就会觉得并不是负担,而且能够提升代码的可靠性和可阅读性。

本文只是抽取了其中部分常用的规范,如果希望进行深入的了解可以访问下方连接查看《Google开源项目风格指南》进行系统学习。

https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/contents/

相关文章
|
1月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
1月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
1月前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
116 80
|
2月前
|
存储 索引 Python
Python编程数据结构的深入理解
深入理解 Python 中的数据结构是提高编程能力的重要途径。通过合理选择和使用数据结构,可以提高程序的效率和质量
162 59
|
22天前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
40 14
|
1月前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
83 2
|
1月前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
57 10
|
1月前
|
机器学习/深度学习 人工智能 Java
Python 语言:强大、灵活与高效的编程之选
本文全面介绍了 Python 编程语言,涵盖其历史、特点、应用领域及核心概念。从 1989 年由 Guido van Rossum 创立至今,Python 凭借简洁的语法和强大的功能,成为数据科学、AI、Web 开发等领域的首选语言。文章还详细探讨了 Python 的语法基础、数据结构、面向对象编程等内容,旨在帮助读者深入了解并有效利用 Python 进行编程。
|
1月前
|
机器学习/深度学习 人工智能 数据挖掘
探索Python编程的奥秘
在数字世界的海洋中,Python如同一艘灵活的帆船,引领着无数探险者穿梭于数据的波涛之中。本文将带你领略Python编程的魅力,从基础语法到实际应用,一步步揭开Python的神秘面纱。
49 12
|
1月前
|
IDE 程序员 开发工具
Python编程入门:打造你的第一个程序
迈出编程的第一步,就像在未知的海洋中航行。本文是你启航的指南针,带你了解Python这门语言的魅力所在,并手把手教你构建第一个属于自己的程序。从安装环境到编写代码,我们将一步步走过这段旅程。准备好了吗?让我们开始吧!

热门文章

最新文章