Python推荐一整套开发工具
原文:https://sourcery.ai/blog/python-best-practices/
在开始一个新的Python项目时,很容易不做规划直接进入编码环节。花费少量时间,用最好的工具设置项目,将节省大量时间并带来更快乐的编码体验。
在理想的世界中,所有开发人员使用的依赖库都是相同的,代码将被完美地格式化,禁止常见错误,并且测试将涵盖所有内容。此外,每次提交代码时都会确保符合这些要求。
在本文中,我将介绍如何设置一个这样的理想项目。你可以跟随我的步骤操作,也可以直接开始安装pipx和pipenv,然后生成新项目。
让我们创建一个新的项目目录:
mkdir best_practicescd best_practices
Python命令行工具与pipx
Pipx是一个方便的实用程序,允许快速安装python命令行工具。我们将用它来安装 pipenv 和 cookiecutter 。
python3 -m pip install --user pipxpython3 -m pipx ensurepath
使用 pipenv 进行依赖管理
Pipenv自动为您的项目创建和管理virtualenv,以及在安装/卸载软件包时从Pipfile添加/删除软件包。它还生成了非常重要的Pipfile.lock文件,用于生成确定性构建。
知道你和你的同事正在使用相同的库版本,可以极大提升信心。Pipenv 可以实现这个点,因此在过去一年多里得到了大量开发者的青睐
pipx install pipenv
使用 black 和 isort 进行代码格式化
Black是代码格式化工具:
Black是不妥协的Python代码格式化程序。通过使用它,意味着您同意放弃对手动格式化细节的控制。作为回报,Black 为你提供速度和确定性,并且无需处理 pycodestyle 的繁琐提示。你将有更多的时间,来处理更重要的事情。 无论是什么项目,Black 格式化后的代码看起来都是一样的。习惯之后,你不会再注意到格式的问题,可以专注于内容。 Black产生的代码差异最小,可以加速代码审查。
isort则用来处理 import 的排序:
isort是可以按字母顺序对 import 进行排序,并自动分成多个部分。
让我们使用pipenv安装它们为开发依赖库,这样就不会让部署版本变得更复杂:
pipenv install black isort --dev
Black 和 isort 的默认选项之间有冲突,因此我们将覆盖 isort 的选项配置,使用 Black 的配置。创建一个 setup.cfg
文件并添加此配置:
[isort]multi_line_output=3include_trailing_comma=Trueforce_grid_wrap=0use_parentheses=Trueline_length=88
我们可以这样运行这些工具:
pipenv run blackpipenv run isort
用flake8强化风格
Flake8确保我们的代码遵循PEP8的约定。使用pipenv安装:
pipenv install flake8 --dev
就像isort一样,它需要一些配置才能与 Black 配合使用。将此配置添加到 setup.cfg
:
[flake8]ignore = E203,E266,E501,W503max-line-length = 88max-complexity = 18select = B,C,E,F,W,T4
现在我们可以使用 pipenv run flake8
运行flake8。
使用 mypy 检查静态类型
Mypy是Python的一个可选静态类型检查器,旨在结合动态(或“鸭子”)类型和静态类型的好处。Mypy将Python的表现力和便利性与强大的类型系统和编译时类型检查相结合。Mypy对标准Python程序进行类型检查,使用 Python VM 运行 mypy 基本没有运行时的开销。
在Python中使用类型需要慢慢习惯,但好处是巨大的。mypy 官网这样写道:
- 静态类型可以使程序更容易理解和维护
- 静态类型可以帮助您更早地发现错误,并减少测试和调试
- 静态类型可以帮助您在代码投入生产之前找到难以发现的错误
pipenv install mypy --dev
默认情况下,Mypy将递归检查所有类型注释的导入,这会导致库不包含这些注释时出错。我们需要将mypy配置为仅在我们的代码上运行,并忽略没有类型注释的导入的任何错误。我们假设代码存在于以下配置的 best_practices
包中。将如下配置添加到 setup.cfg
:
[mypy]files=best_practices,testignore_missing_imports=true
现在我们可以运行mypy:
pipenv run mypy
mypy 的速查表:https://mypy.readthedocs.io/en/latest/cheatsheetpy3.html
使用pytest和pytest-cov进行测试
使用pytest编写测试非常容易,并且消除编写测试的阻力,意味着我们会编写更多的测试!
pipenv install pytest pytest-cov --dev
以下是pytest网站的一个简单示例:
# content of test_sample.pydef inc(x): return x + 1 def test_answer(): assert inc(3) == 5
执行示例:
$ pipenv run pytest=========================== test session starts ============================platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.ycachedir: $PYTHON_PREFIX/.pytest_cacherootdir: $REGENDOC_TMPDIRcollected 1 item
test_sample.py F [100%]
================================= FAILURES =================================_______________________________ test_answer ________________________________
def test_answer():> assert inc(3) == 5E assert 4 == 5E + where 4 = inc(3)
test_sample.py:6: AssertionError========================= 1 failed in 0.12 seconds =========================
所有的测试都应该放在 test
目录中,所以将这个配置添加到 setup.cfg
:
[tool:pytest]testpaths=test
我们还想检查测试覆盖了多少代码。创建一个新文件 .coveragerc
,用来返回应用程序代码的覆盖率统计信息,我们再次假设代码位于 best_practices
模块中:
[run]source = best_practices
[report]exclude_lines = # Have to re-enable the standard pragma pragma: no cover
# Don't complain about missing debug-only code: def __repr__ if self\.debug
# Don't complain if tests don't hit defensive assertion code: raise AssertionError raise NotImplementedError
# Don't complain if non-runnable code isn't run: if 0: if __name__ == .__main__.:
我们现在可以运行测试并报告覆盖率
pipenv run pytest --cov --cov-fail-under=100
如果对应用程序代码的测试覆盖率低于100%,则会失败。
pre-commit 的 Git 钩子
Git钩子允许您在任何时候提交或推送时运行脚本。这就可以支持我们在每次提交/推送时,自动运行所有的格式化和测试。pre-commit可以帮助我们轻松配置这些钩子:
在提交代码审查之前,Git钩子脚本可以帮助识别简单问题。每次提交时运行钩子,自动指出代码中的问题,例如缺少分号,尾随空格和调试语句。在代码审查之前指出这些问题,可以让代码审查者专注于代码架构的变化,而不是浪费时间检查格式问题。
在这里,我们配置在提交Python 文件修改时,执行上述所有检查,并且仅在推送时运行pytest覆盖率测试,因为耗时可能较长。创建一个新文件 .pre-commit-config.yaml
:
repos:- repo: local hooks: - id: isort name: isort stages: [commit] language: system entry: pipenv run isort types: [python]
- id: black name: black stages: [commit] language: system entry: pipenv run black types: [python]
- id: flake8 name: flake8 stages: [commit] language: system entry: pipenv run flake8 types: [python] exclude: setup.py
- id: mypy name: mypy stages: [commit] language: system entry: pipenv run mypy types: [python] pass_filenames: false
- id: pytest name: pytest stages: [commit] language: system entry: pipenv run pytest types: [python]
- id: pytest-cov name: pytest stages: [push] language: system entry: pipenv run pytest --cov --cov-fail-under=100 types: [python] pass_filenames: false
如果你需要跳过这些钩子,你可以运行 git commit--no-verify
或 git push--no-verify
使用cookiecutter生成项目
我们已经看到了理想项目都使用了哪些工具,可以将其固化为一个模板,只需要1个命令 即可生成新项目:
pipx run cookiecutter gh:sourceryai/python-best-practices-cookiecutter
填写项目名称和仓库名称,即可使用模板为你生成项目。
要完成设置,请按照下列步骤操作:
# Enter project directorycd <repo_name>
# Initialise git repogit init
# Install dependenciespipenv install --dev
# Setup pre-commit and pre-push hookspipenv run pre-commit install -t pre-commitpipenv run pre-commit install -t pre-push
模板项目包含一个非常简单的Python文件和测试来试用这些工具。一旦你对代码感到满意,你就可以做第一个 git commit
,这时所有的钩子都会运行。
Python推荐一整套开发工具的更多相关文章
- Python IDE集成开发工具
Python IDE集成开发工具 Python IDE 本文为大家推荐几款款不错的 Python IDE(集成开发环境),比较推荐 PyCharm,当然你可以根据自己的喜好来选择适合自己的 Pytho ...
- 初学Python,对于开发工具不是很了解?一文带你选择适合你的开发工具
工欲善其事必先利其器!想要获取更多的开发工具安装包.安装教程,可以加群:725479218, 开发Python用什么工具好呢?其实刚学Python的话,使用IDLE就够了,虽然调试不是特别方便,但是对 ...
- unittest (python标准库-开发工具-单元测试框架)
unittest官方文档摘录 翻译 reffer to: https://docs.python.org/3/library/unittest.html#unittest.TextTestRunner ...
- Python 的 GUI 开发工具
kivy https://kivy.org/#home flexx https://flexx.readthedocs.io/en/stable/
- Python 开发工具推荐
对于开发工具,仁者见仁智者见智,关键是自己喜欢,用着顺手就好,不用刻意去追求别人用的是什么工具. 这里给大家主要推荐三款工具,分别是PyCharm.Sublime Text 3.VS Code,因为这 ...
- Mac iOS Mac Watch 应用和游戏编程开发工具推荐
今日分享「iOS / Mac / Watch 应用和游戏开发工具」推荐,这期专题主要为iOS开发者推荐一些优秀的设计和开发工具,这些工具包含移动原型的设计.程序的开发等,可以大大提高开发的效率!专题会 ...
- SharePoint 2013常用开发工具分享
众所周知,一款好的开发工具不仅能提高项目开发效率,而且能够协助开发人员简化开发流程.本文汇总几款SharePoint 2013开发常用开发工具,希望能够对大家有所帮助.如果您有更好的工具,没有包含在本 ...
- SharePoint 2013常用开发工具
SharePoint 2013常用开发工具分享 2014-04-01 00:59 by jv9, 589 阅读, 1 评论, 收藏, 编辑 众所周知,一款好的开发工具不仅能提高项目开发效率,而且能够协 ...
- Python集成开发工具(IDE)推荐
1.7 Python集成开发工具(IDE)推荐 1.7.1 Notepad++ Notepad++是Windows操作系统下的一套文本编辑器(软件版权许可证: GPL),有完整的中文化接口及支持多国语 ...
随机推荐
- Hive架构分析
一.Hive三种设计模式 1.默认配置[使用Netty存储元数据] 2.mysql[使用mysql存储元数据] 3.配置Thrift[使用mysql存储元数据] 二.执行步骤 三.scala访问Hiv ...
- Java里面获取当前服务器(linux环境)的IP地址--与请求者的真实IP
package com.wfd360.Util; import javax.servlet.http.HttpServletRequest; import java.net.Inet4Address; ...
- SpringBoot2.x项目初始化
1. 项目初始化说明 使用SpringBoot生成器 修改application.properties为application.yml 启动运行SpringBoot项目 2. 初始化项目 Spring ...
- H3C 802.11b/g工作频段划分图
- mongodb replica-set
mongodb 主从复制 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系 ...
- 前端JS
目录 1.javascript介绍 1.1Web前端有三层: 1.2其中JavaScript基础又分为三个部分: 1.3JavaScript入门易学性 1.4JavaScript的组成 1.5Java ...
- 调用office Word Com 组件,提示权限不足处理
最近一直在处理一个项目,项目主要功能与Office-Word 有关,主要涉及到文本内容编辑与样式设置等相关内容.因项目依赖office 相关dll,需要兼容多种Office 版本(office 200 ...
- jquery对象转成dom对象
jQuery库本质上还是JavaScript代码,它只是对JavaScript语言进行包装处理,为的是提供更好更方便快捷的DOM处理与开发中经常使用的功能.我们使用jQuery的同时也能混合Java ...
- 20199301《Linux内核原理与分析》第十一周作业
Linux Capability探索实验 一.实验描述 本实验中,将感受到linux capability功能在访问控制上的优势,掌握使用Capability达到遵守最小权限原则的目的,并分析linu ...
- 使用selenium谷歌浏览器驱动配置:
from selenium import webdriver#导入谷歌浏览器的chrome_driverchrome_driver = r"C:\python36\Lib\site-pack ...