2020年新年标志着Python2和Python3共存十多年的结束。在此期间,Python环境发生了很大变化:大量新工具和最佳实践现在改善了Python开发人员的体验。然而,由于传统支持的限制,irad选项落后了。
本系列文章是现代Python工具的指南,重点关注简单性和极简性。1它将指导您创建一个完整且最新的Python项目结构,包括单元测试、静态分析、类型检查、文档编制以及持续集成和交付。
本指南面向热衷于从一开始就学习最佳实践的初学者,以及工作流程受到遗留工具箱要求的样板和变通方法影响的经验丰富的Python开发人员。
本教程需要一个带有bash、curl和git的最新Linux、Unix或Mac系统。
在Windows10上,启用Windows Subsystem for Linux(WSL)并安装Ubuntu 18.04 LTS发行版。从开始菜单打开Ubuntu,并使用以下命令安装其他软件包:
sudo apt update&;&;sudo apt install-y make build-Essential libssl-dev zlib1g-dev\libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncures5-dev\libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl g。
在第一章中,我们使用pyenv和Pory设置了一个Python项目。我们的示例项目是一个简单的命令行应用程序,它使用Wikipedia API在控制台上显示随机事实。
本指南有一个配套的存储库:cjolowicz/HyperModern-python,指南中的每一篇文章都对应于GitHubrepository中的一组提交。
出于本指南的目的,GitHub用于托管您的项目的公共git存储库。其他流行的选择是GitLab和BitBucket。创建存储库,并用Readme.md和许可证文件填充它。对于这个项目,我将使用麻省理工学院的许可,一个简单的许可许可。
在本指南中,请使用您自己的存储库的名称替换hymort-python。选择不同的名称以避免PyPI上的名称冲突。
当您按照本指南的其余部分操作时,创建一系列记录您的步骤的小的原子提交。使用git status来发现由指南中所示的命令生成的文件。
让我们继续设置开发人员环境。首先,您需要获得最新的Python。不要为包管理器或官方二进制文件而烦恼。选择的工具是pyenv,这是一个Python版本管理器。
使用官方说明中列出的命令之一,为您的平台安装Python构建依赖项。例如,在最近的Ubuntu上,这将是:
sudo apt update&;&;sudo apt install-y make build-Essential libssl-dev zlib1g-dev\libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncures5-dev\libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl g。
您已经准备好安装最新的Python版本。这可能需要一段时间:
Python3.8.2是默认版本,可以作为python调用,但是这两个版本都可以分别作为python3.7和python3.8访问。
POLITE是一种管理Python打包和依赖关系的工具。它的易用性和对现代工作流程的支持使其成为历史悠久的安装工具的理想继承者。它类似于JavaScript世界中的NPM和YAR,也类似于其他现代的包和依赖项管理器。有关诗歌的替代方法,请参阅flit、pipeenv、pyflow和dephell。
此命令将创建pyproject.toml文件,这是PEP517和518中指定的新Python包配置文件。
#pyproject.toml[工具。诗歌]名称=";超现代-Python&34;版本=";0.1.0";描述=";";作者=[";您的名字<;[email protected]>;][工具。诗歌。依赖项]python=";^3.8";[工具。诗歌。开发人员依赖关系][构建系统]需要=[";POLITE>;=0.12";]build-backend=";poetry.masonry.api";
这样就可以了:一个TOML语法的声明性文件,包含整个包配置。让我们向包中添加一些元数据:
#pyproject.toml[工具。诗歌]..。描述=";超现代巨蟒项目";许可证=";麻省理工学院";自述=";自述文件";主页=";https://github.com/<;your-username>;/hypermodern-python";存储库=";https://github.com/<;your-username>;/hypermodern-python";关键字=[";超现代";]。
诗歌增加了对Python3.8的依赖,因为这是Youran的Python版本。通过将其更改为Python3.7,也支持上一版本:
版本号前面的插入符号(^)表示“直到下一个主要版本”。换句话说,您承诺当用户升级到Python3.8或3.9时,您的包不会损坏,但是您不能保证在未来的Python4.0中使用它。
让我们创建一个初始骨架包。在srclayout中组织您的包,如下所示:
.├──pyproject.toml└──src└──超级现代_python└──__init__.py 2个目录,2个文件。
使用蛇形大小写作为包名hymordypython,而不是使用kebabcase作为存储库名称hymortypython。换句话说,根据您的存储库来命名包,用下划线替换连字符。
用您自己的存储库的名称替换HYMANDICAL-Python,以避免在PyPI上发生名称冲突。
虚拟环境为您的项目提供了一个隔离的运行时环境,该环境由特定的Python版本和一组独立的已安装Python包组成。这样,您当前项目的依赖项不会干扰系统范围的Python安装或您正在处理的其他项目。
Posire为您的项目管理虚拟环境。要查看它的运行情况,请使用poetryinstall安装骨架包:
$POLITY安装在…中创建虚拟环境超现代-python-rLESuZJY-py3.8。/py诗歌/viralenvs更新依赖项解析依赖项.。(0.1s)写入锁定文件无需安装或更新-安装超现代-python(0.1.0)。
Posire现在已经为您的项目创建了一个虚拟环境,并将您的初始包安装到其中。它还创建了一个所谓的锁文件,名为poetry.lock。您将在下一节中了解有关此文件的更多信息。
$POLITY Run pythonPython3.8。2(缺省,2020-02-26 07:03:58)[GCC 8.3。0]有关详细信息,请访问linuxType";Help";,";版权所有";,";Credits";或";License";。>;>;>;导入超级现代_python>;>;>;超级现代_python。__version__';0.1.0';>;>;>;
让我们安装第一个依赖项,即单击包。这个Python包允许您根据需要用少量代码以可组合的方式创建漂亮的命令行界面。您可以使用poetryadd安装依赖项:
$POLITY ADD CLICK使用^7.0版单击更新依赖项解析依赖项.。(0.1s)写入锁定文件打包操作:1个安装、0个更新、0个删除-安装点击(7.0)。
pyproject.toml中的依赖项包含已安装软件包的版本约束:^7.0。这意味着该软件包的用户至少需要当前版本7.0。该约束还允许更新版本的包,只要版本号不指示破坏性更改即可。(在1.0.0之后,语义版本控制将破坏性更改限制为主要版本。)。
相比之下,poetry.lock包含安装到虚拟环境中的Click的确切版本。将此文件置于源代码管理之下。它允许团队中的每个人在相同的环境中工作。它还可以帮助您保持生产和开发环境尽可能相似。
现在,将依赖项升级到新的次要版本或修补程序版本与使用程序包名调用POLITE更新一样容易:
要升级到新的主要版本,您需要明确更新版本约束。从先前的Click主要版本开始,您可以使用以下命令升级到7.0:
是时候向包中添加一些实际代码了。正如您可能已经猜到的那样,我们将使用单击创建一个控制台应用程序:
$POLITY RUN HYMAND-Python--help用法:HYMANDICAL-Python[选项]超现代的Python项目。选项:--version显示版本并退出。--帮助显示此消息并退出。
让我们构建一个示例应用程序,将随机事实打印到控制台。数据从WikipediaAPI检索。
#src/HyperModern_python/console.py import textwrap import单击Import Requests from。IMPORT__VERSION__APIURL=";https://en.wikipedia.org/api/rest_v1/page/random/summary";@CLICK.COMMAND()@CLICK.VERSION_OPTION(VERSION=__VERSION__)def Main():";";";超现代Python项目。";";";";请求.get(API_URL)作为响应:Response.raise_for_status()data=Response.json()title=data[";title";]Extract=data[";Extract";]单击.secho(title,fg=";green";)click.echo(textwrap.ill(Extract))。
让我们先看一下模块顶部的导入。
标准库中的textwrap模块允许您在将文本打印到控制台时换行。我们还导入了新安装的请求包。空行用于按照PEP8中的建议对导入进行分组(标准库-第三方软件包-本地导入)。
API_URL常量指向英文维基百科的rest API,或者更具体地说,指向其/page/Random/Summary端点,该端点返回随机维基百科文章的摘要。
在main函数的主体中,requests.get调用向Wikipedia API发送HTTPGET请求。WITH语句确保HTTP连接在块的末尾关闭。在查看响应正文之前,我们检查HTTPstatus代码,如果它发出错误信号,则引发异常。响应体包含JSON格式的资源数据,可以使用response.json()方法访问。
我们只对标题和摘录属性感兴趣,它们分别包含维基百科页面的标题和简短的纯文本摘录。
最后,我们使用click.echo和click.secho函数打印标题并提取到控制台。后一个函数允许您使用fg关键字属性指定前景颜色。函数的作用是:在Extract中对文本进行换行,使每一行的长度最多为70个字符。
$Position Run超现代-巨蟒Jägersbleeker Teich位于德国中部哈兹山脉的Jägersbleeker Teich是下萨克森州戈斯拉县Clausthal-Zellerfeld镇附近的蓄水池。它是为采矿业而修建的上哈兹池塘之一。
你可以随便玩一下这个。以下是一些你可能想要尝试的东西:
本指南的标题灵感来自萨维利·塔塔考尔(SaviellyTartakower)于1924年撰写的“超现代国际象棋游戏:超现代棋局”(Die HypercentneSchachparte)一书。它考察了第一次世界大战后十年间国际象棋理论发生的革命。这一章中的图片是阿尔伯特·罗比达(Albert Robida)于1902年出版的手工彩色印刷品“Le sortie de l‘opéra en l an2000”(离开歌剧于2000年)的细节(资料来源:国会图书馆)。↩︎