高质量Python代码编写的5个优化技巧
作者:Michael Washburn Jr. 发布时间:2022-04-20 16:49:16
如今我使用 Python 已经很长时间了,但当我回顾之前写的一些代码时,有时候会感到很沮丧。例如,最早使用 Python 时,我写了一个名为 Sudoku 的游戏(GitHub地址:https://github.com/MichaelWashburnJr/PythonSudoku)。这个游戏在当时算是我比较拿得出手的项目了。然而现在,我无法直接复制其代码并运行它,具体原因是我当时编码时没有添加一个setup.py 或者 requires.txt 文件,当然,这种错误我肯定不会再犯!
由此,我总结了多年来自己所编写的 Python 代码的质量变化过程。它们变得更加简洁、健壮、易读。但是什么原因使得 Python 代码变得更好呢?
在本文中笔者将与大家共同探讨一些 Python 代码的优化手段,或大或小。希望以此帮助你提高 Python 代码的质量。当然,这些方式也可以适用于其他编程语言和技术。
1. 将代码设置为可通过 PIP 安装的软件包
当你想要使用一个新的 Python 包时,如果可以使用 “pip install”命令跟上包名或者包的位置来安装的话,就会非常方便。
有很多方法可以实现这一点,我的“go to”项目实现方法是创建一个 setup.py 文件。
假设我们在“flask_example.py”中有一个简单的 Flask 程序:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
def main():
app.run()
if __name__ == ‘__main__':
main()
我们可以将其设置为一个可安装的 Python 包。方法是:首先把它移动到一个单独的文件夹中(我们称之为“flask_example /”),然后在项目根文件夹中创建一个如下所示的setup.py 文件:
from distutils.core import setup
setup(
name='flask_example',
version='1.0',
description='Hello, World! in flask.',
packages=['flask_example'],
install_requires=[
'Flask==0.12.2'
],
entry_points = {
'console_scripts': 'runserver=flask_example.flask_example:main'
}
)
这样做可以带来一系列优点。 首先,你可以使用“pip install -e”在本地安装你的应用程序。这样,开发人员可以轻松克隆和安装项目,因为 setup.py 文件将会处理掉所有繁重的工作。
其次,使用 setup.py 文件来进行依赖关系管理。install_requires 变量能够定义要使用的软件包以及版本。如果你不确定使用的软件包名称和版本,可以运行“pip freeze”来查看它们。
最后,它可以为你的程序包定义入口点,通过简单运行“runserver”即可在命令行中执行代码。
2. 借助 linter 工具捕获代码错误
使用 linter(语法检查)可以自动修复代码的语法问题。PyLint 是一款强大的 Python 版本的 linter 工具,如果你使用类似 Git 这样的版本控制系统,可以在提交代码之前让 Git 通过一个 linter 运行代码来解决语法问题。
首先需要安装 PyLint 软件包:
pip install pylint
然后,将以下代码添加到.git/hooks/pre-commit。如果你已经有一个 pre-commit hook,那么只需将 pylint 命令附加到文件的末尾即可。
#!/bin/sh
pylint <your_package_name>
这样做之后就可以在代码提交到 Git 存储库之前自动捕获各种错误。除了语法错误之外,它还能捕捉一些其他的 linter 工具能够捕捉到的常见错误。
3. 尽量使用绝对路径导入而不是相对路径
在 Python 中,使用相对路径导入模块的情况很少(例如 from . import <模块名>)。如果你已经为 Python 项目创建一个 setup.py(或者使用其他类似的机制)文件,那么你可以简单地通过模块的完整路径引用其子模块。
PEP-8(Python风格指南) 推崇绝对路径导入。这样的话包名更加直观,根据 Python 软件基金会的说法就是“更规范”。
使用相对路径的做法很快就会变成一场噩梦。早期的时候可能没有问题,但是一旦你改名了模块路径或者进行重大的重构之后,它真的会让你很头痛。
4. 上下文管理(with 关键字)
无论何时打开文件、流或者连接,你通常都会使用上下文管理器。上下文管理器很有用,它能够处理文件的关闭并抛出异常。Python 中使用 with 关键字可以很好的实现该功能。
大多数 Python 初学者可能会使用如下方式写入文件:
f = open(‘newfile.txt', ‘w')
f.write(‘Hello, World!')
f.close()
这样做很简单,但是想象一下这种情况:假设你在文件中写入了数千行,不幸的是突然抛出异常,你的文件并未正确关闭,此时你已经写入文件的所有数据都会损坏或者丢失。
不用担心,通过一些简单的重构,即使遇到异常我们也可以确保文件正常关闭。我们可以这样做:
with open(‘file', ‘w') as file:
file.write(‘Hello, World!')
非常简单!并且代码变得更加简洁。你还可以使用单个“with”语句打开多个上下文管理器,而无需嵌套多个“with”语句。
with open(‘file1', ‘w') as f1, open(‘file2', ‘w') as f2:
f1.write(‘Hello')
f2.write(‘World')
5. 使用直观、贴切的函数和变量名
在 Python 中,很容易对函数和返回值产生疑惑。特别是当你调用某些库里的函数时。如果你能够避免开发者通过查询文档才能得知函数功能,这样的时间节省将是一个非常有价值的改进。如何做到呢?如何改变一些简单的变量名称来节省开发时间呢?
在命名函数或变量名时,我会着重考虑3点:
函数或变量的功能
与函数或变量相关联的单位
函数或变量计算的数据类型
例如,如果我想创建一个函数来计算一个矩形的面积,我将函数命名为“calc_rect_area”。但这并没有给用户提供足够的信息。函数会返回值吗?还是将值存储在其他某个地方?返回值的单位是英尺还是米呢?
为了使函数名提供更多信息,我将其修改为“get_rect_area_sq_ft”。这使得用户清楚地知道该函数获取并返回面积,并且单位是英尺。
如果你使用一些更加友好的函数和变量名为开发人员节省5分钟,这些时间累积起来将大大提升开发者的效率。
总结
这些方法是我多年使用 Python 编程所积累的经验。有些是我自己的总结,有些来自他人的指点。我希望上述建议能够助你写出更好的 Python 代码。
作者丨Michael Washburn Jr.
译者丨安翔


猜你喜欢
- 1. zip() 函数的介绍1.1 功能zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组
- md5是一种常见不可逆加密算法,使用简单,计算速度快,在很多场景下都会用到,比如:给用户上传的文件命名,数据库中保存的用户密码,下载文件后检
- 元类是可以让你定义某些类是如何被创建的。从根本上说,赋予你如何创建类的控制权。元类也是一个类,是一个type类。 元类一般用于创建
- ⛳️ 本次反反爬实战案例背景本篇博客选择的案例是由 VX 好友提出,他希望有一篇博客能简单的介绍清楚下面这个问题。快速定位加密参数逻辑,快速
- 一、检测网络信息和系统信息 在Frontpage 2000 的Explorer管理器中选择帮助(Help)|关于Frontpage管理器(A
- 上一篇介绍了 HTML5 中 Canvas 的基本概念,这篇将要介绍一下 Canvas&n
- if语句用来表示某种可能的情况,并如何处理该情况。if语句可以用来表示一种可能性、两种可能性或者多种可能性。1 一种可能性单个的if语句表示
- 引言在使用SqlServer Express 版本的时候发现,这个版本不支持通过数据库的代理方式进行数据库的维护。解决方案使用SQL语句加w
- #第一种def delRepeat(liebiao): for x in liebiao: while li
- 删除重复记录,将TABLE_NAME中的不重复记录保存到#TABLE_NAME中 select distinct *&n
- linux系统使用python获取cpu信息脚本分享#!/usr/bin/env Pythonfrom __future__ import
- 小编相信对于大多数熟悉Python的人来说,一定都听说并且使用过pip这个工具,但是对它的了解可能还不一定是非常的透彻,今天小编就来为大家介
- 本文实例讲述了Smarty实现页面静态化(生成HTML)的方法。分享给大家供大家参考,具体如下:为了减少数据库读取次数,某些内容不经常被更改
- 前言大家应该经常在朋友圈看到有人发九宫格图片,其实质就是将一张图片切成九份,然后在微信中一起发这九张图即可。说到切图,Python 就可以实
- 概述Rollup, 和 Webpack, Parcel 都是模块打包工具(module bundler tool), 但是侧重点不同, 我们
- python map函数map()函数map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依
- 引言skimage提供了io模块,顾名思义,这个模块是用来图片输入输出操作的。为了方便练习,也提供一个data模块,里面嵌套了一些示例图片,
- 需要建立2个文件,一个作为客户端,一个作为服务端文件一 作为客户端client,文件二作为服务端serverudp的特点是不需要建立连接文件
- 一、在vs中新建一个工程,然后新建一个源文件二、右击上述图片中的mysql_test工程名,然后在最下方找到属性,并点击三、点击VC++目录
- #!/usr/bin/env python2#-*- coding:utf-8 -*-__author__ = 'jalright&