一篇文章带你了解谷歌这些大厂是怎么写 python 代码的
作者:柠檬软件测试 发布时间:2021-03-05 05:14:51
谷歌内部的 python 代码规范
熟悉 python 一般都会努力遵循 pep8 规范,也会有一些公司制定内部的代码规范。大公司制定规范的目的不是说你一定要怎样去使用编程语言,而是让大家遵守同一套规则,节省其他人阅读代码的成本,方便协作和沟通。对于个人而言,日常编写代码只需要保持风格统一,前后一致,就是一个很大的胜利,然后再加入一些实用的规则,在写代码的时候有效减少可能引入的 bug。
接下来,我截取了一些谷歌的 python 代码规范中一些有意思的要点,希望日后能更深刻的感受到它们的用处。
1.导入模块和包,不导入单独的类、函数或者变量。
这通常能简化导入过程,方便命名空间管理。但是缺点也很明显,当名称较长时,调用函数和类的代码会很长,影响可读性。
# yes
from sound.effects import echo
echo.EchoFilter()
# no
from sound.effects.echo import EchoFilter
EchoFilter()
2.从根目录导入,不假定任意的 sys.path,也不使用相对导入。
假设 doctor.who 路径已经被某种手段添加到了 sys.path,也应该从开始的地方导入。
# yes
from doctor.who import jodie
# other than doctor.who is already in sys.path
# no
import jodie
3.谨慎使用异常
使用异常需要注意的细节有:
优先合理的使用内置异常类。比如需要正数的情况下传递了一个负数引发的错误,抛出 ValueError 类型。
永远不要使用 except 捕获所有的异常,这可能会造成一些隐藏 bug 难于发现。你应该使用特定异常类型分开捕获。
不要使用 assert 指示某些意外情况,应该使用 raise。
不要在 try 和 except 子句中加入太多逻辑,try 块的体积越大, 期望之外的异常就越容易被触发。
尽量使用正确的内置异常类型:
def division(a, b):
if b == 0:
raise ValueError('b can not be zero')
避免全局捕获异常,指定异常类型:
# yes
try:
1 / 0
"abc"[100]
except ZeroDivisionError:
...
except IndexError:
...
# no
try:
1 / 0
"abc"[100]
except:
...
4.不要使用可变类型作为函数默认值,如果修改了这个变量,默认值也会跟着发生变化。
# yes
def foo(a, b=None):
if b is None:
b = []
def foo(a, b: Sequence = ()):
# no
def foo(a, b=[]):
def foo(a, b=time.time()):
def foo(a, b={}):
5.注意条件表达式的隐式布尔值
对于序列(字符串, 列表, 元组), 要注意空序列是 False,在判断是否为空序列时,使用隐性的 if not seq 判断,而不用 if len(seq) == 0;
判断数字是否为 0,则使用 number == 0,而不使用用 if not number。因为 number 可能设置的是默认值为 None。
判断是否为 None 使用 x is None,而不用 not x。
# yes
.if not users: # sequence
if number == 0:
if i % 10 == 0:
def f(x=None):
if x is None:
# no
if len(users) == 0:
if number is not None and not number:
if not i % 10:
def f(x=None):
x = x or []
6.谨慎使用装饰器
装饰器可以在函数的参数或返回值上执行任何操作,这可能导致让人惊异的隐藏行为。而且, 装饰器在导入时执行,从装饰器代码中捕获错误并处理是很困难的。使用装饰器一定要编写单元测试,并且说明它的作用和使用方法。装饰器本身不要依赖于任何文件, socket, 数据库连接。避免使用 @staticmedthod 装饰器,多数情况下,将方法封装成模块级的函数可以达到同样的效果。
7.建议使用类型声明,类型声明的好处非常明显:
使用类型声明可以提高代码的可读性。
也可以使用类型检查工具提早发现问题。
使用类型声明之后,doc string 中就没有必要对参数类型进行说明。
在编辑器中会根据类型进行代码提示。
但是在实际操作过程中,类型声明往往很难维持。当代码更新完之后,一定要记得更新类型声明,过时的类型声明会对阅读者造成误导。python 的类型声明成本学习成本较高。
# yes
name: str = 'yuz'
def func(a: int) -> List[int]:
来源:https://blog.csdn.net/m0_60149999/article/details/120295591
猜你喜欢
- 其实很简单,一般的数组去重可以直接用 new Set() 方法即可,但是数组对象的话,比较复杂,不能直接用,我们可以采取间接的方法来去重un
- 就目前互联网上大小网站而言,大部分都是采用ASP+ACCESS/SQL Server或者PHP+MySQL来编写;事实上,ASP和MySQL
- 英文原文:http://www.456bereastreet.com/archive/200601/css_3_selectors_expl
- 序列化把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serializa
- 本文主要给大家介绍了关于Python中字典(dict)合并的四种方法,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍:字典是Pyt
- 本文研究的主要是python通过elixir包操作mysql数据库的相关实例,具体如下。python操作数据库有很多方法,下面介绍elixi
- 不错,这个是一个文章详细页,没有左右两栏布局,不过这里我重点要讲的是合理的布局,在稍后的文章中我会详细的介绍浮动元素。好,回到刚才的话题,大
- 简 介: 根据文档安装指南 介绍了在本机安装PaddlePaddle的步骤。关键词: PaddlePaddle,pip,安装§01 安装Pa
- 1、创建索引对于查询占主要的应用来说,索引显得尤为重要。很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索
- 微信小程序与php 实现微信支付的简单实例小程序访问地址:payfee.PHP:include 'WeixinPay.php'
- 当数据库的数据量读写频繁的时候,我们就要考虑把数据库的读写分开,以提高数据库的使用效率,(当然还有其他用处比如,备份数据),这个时候我们就要
- 本文记录了mysql 5.7.18绿色版下载安装的详细过程1、先下载mysq5.7.18绿色版,然后解压出来,放在一个目录下,我的解压mys
- 在NLP中,数据清洗与分词往往是很多工作开始的第一步,大多数工作中只有中文语料数据需要进行分词,现有的分词工具也已经有了很多了,这里就不再多
- spring boot 不连接数据库启动用spring boot 搭建的项目,在配置文件不连接数据库启动项目会报错。原因在于spring b
- 本文实例讲述了php查询mysql数据库并将结果保存到数组的方法。分享给大家供大家参考。具体分析如下:这里主要用到了mysql_fetch_
- group by函数应该的使用应该是SELECT 列表中指定的每一列也必须出现在 GROUP BY 子句中,除非这列是用于聚合函数,但是今天
- 1、前期准备通过 pip 或 easy_install 安装了 pymongo 之后, 就能通过 Python 调教 mongodb 了.接
- 1. 概念图像融合: 两幅图片叠加在一起,形成前景背景的效果。2. 流程(1)读入要融合的两幅图片。(2)把两幅图片调整到统一大小,方便下一
- 锁是指在某组资源中,两个或两个以上的线程在执行过程中,在争夺某一资源时而造成互相等待的现象,若无外力的作用下,它们都将无法推进下去,死时就可
- 何为自省在计算机编程领域里,自省是一种能力,是通过一定机制在程序运行时获知对象的类型及对象的内部结构,Python的自省能力还是很强大的,因