Python 的 2018 年终总结:发展状况回顾
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Python 的2018 年终总结:发展状况回顾
这个月早些时候我在加拿大PyCon的演讲让我兴奋不已,在会议期间,我与许多聪明人交谈,似乎每个人都在谈论着同样的希望和痛苦。这是一个试图将社区中微弱的耳语合成一个单一的有凝聚力的帖子。
我爱Python。到目前为止,我在个人项目和专业项目中使用Python已经差不多10年了。我的工作是等量数据分析和快速原型设计,所以,Python很自然地成为一个很好的选择。Python最大的吸引人的地方就是,它有包含了几乎所有的库:机器学习,数据分析,重现性研究,可视化,云计算,Web API和控件。
这是一个令人惊异的团体,和他们在StackOverflow和GitHub上进行在线交互通常是一种乐趣,所以我决定回来。2015年,我的一个朋友正在我们学校组织加拿大PyCon,并把我拉进了志愿者行列。我发现这个社区的人都很友好,而且非常有创意(那些想要使用Python描述木头结构特征的人???)。今年,我想我应该回报一些,于是在我的家乡多伦多的PyCon上做了一次演讲。我被这个社区在短短3年里的发展所震惊。当我被告知我将在“舞厅”演讲时,我以为那只是一个房间的名字,结果比那要大一点。
和以前一样,我发现这个社区充满了聪明而有创造力的人。关于《专横的声音:用Python 揭露哈利波特中的性别偏见》的讨论就是一个很好的例子,(不考虑你对这个主题的看法),这是一个滑稽而引人注目的标题。
然而,与任何工程的工作一样,Python是一个正在进行的工作。今天我们对语言的理解甚至和五年前都不一样了,所以那些在当时看起来很奇怪的事情现在不仅是可能的,
而且是合乎逻辑的。在这篇文章中,我想阐述我认为对这个社区有前途的发展方向,以及我希望看到它如何发展。
优点
许多好的项目要么在2018年着陆Python大陆,要么克服了它们发展的困难。以下是我最喜欢的:
JupyterLab
Jupyter笔记本是一个web应用程序,它可以在线执行Python(和其他语言)并查看结果,包括图形、经过修饰的表和标记格式的散文。它还自动保存即时结果(类似于一个REPL),允许导出多种格式,并且还有上百个其他特性。想要更深入的了解,请参阅我的PyCon谈话。Jupyter笔记本在社区中应用非常广泛,尤其是在科研领域。Jupyter团队理所当然地获得了2017年的ACM软件系统奖。
Jupyterlab是对传统Jupyter笔记本的一个令人兴奋的改进版。它包括一些引人注目的特性,如单元格拖放、数据文件的内联查看(像CSV)、选项卡环境和一个更加以命令为中心的接口。它仍然感觉像是一个测试版,在Reveal.js幻灯片导出功能和单元格崩溃方面有一些小毛病,并不像预期的那样工作。但总的来说,它是一个好工具变得越来越好,越来越适合用户的复杂程度的完美例子。
Mypy
mypy是Python的一个静态类型检查工具,已经存在了一段时间。但是,它在今年变得非常好,甚至于你可以将它集成到你的生产项目中,作为git钩子或其他CI流程的
一部分。我发现它是对所有代码库的一个极其有用的补充,可以在我编写一行测试代码之前发现绝大多数错误。然而,这并非没有缺陷。在许多情况下,必须进行注释这让人感觉很麻烦,
__init__ (self, *args) -> None
以及其他我认为奇怪的地方。许多常用模块的类型库文件很缺乏,比如:
* flask
* msopack
* coloredlogs
* flask-restplus
* sqlalchemy
* nacl
在没有进行有效配置的情况下将其集成到你的CI系统中仍然是一个问题。-- ignore-missing-imports选项基本上是强制的。在将来,我希望它成为一个社区标准,为所有打算作为库的模块提供类型库文件。
Pipfile and pipenv
我真的很喜欢Pipfiles! Pipfiles实现了PEP508,这促使它替代了Python的依赖管理系统requirements.txt。
最顶层的动机是,和其他语言(如rust和javascript)的管理系统相比,使用pip的依赖管理系统感觉要陈旧。而pip/requirement.txt 的缺陷在社区中似乎人尽皆知,本文是我见过的唯一一篇对其缺陷进行列举的文章,而且比较贴近实际。我推荐你阅读一下,但是它太长了还是不要去读:
还没有关于requirements.txt的相应标准来具体说明它只是列出所有主要和次要的依赖项,还是有具体严格的要求?它包括固定的版本吗?另外,单独将开发环境需求分离出来是非常特别的做法。不同的小组开发不同的部分,所需要的环境需求也不一样,这样一来不利于软件的可再生构建。
保持依赖关系列表的最新需要先执行pip install $package,其次是pip freeze > requirements.txt, 这是一个非常笨拙的工作流,有很多问题。
开发管理生态系统由三个工具和标准(virtualenv、pip和requtrements .txt)组成,它们之间没有清晰的交互关系。既然你试图完成一项任务,为什么没有一种工具可以提供帮助呢?
进入pipenv。
Pipenv自动创建一个虚拟环境,在这个虚拟环境中安装和管理依赖关系,并保持Pipfile的更新。
虽然这个想法很好,但是使用它非常麻烦。在实际使用中,我遇到了很多问题,常常不得不回头使用以前的处理方法——例如使用显式的虚拟环境。我还发现锁定非常慢(部分问题源于setup.py标准,它是工具生态系统中许多其他问题的根源)。
f-strings
f-strings太棒了!许多人都写过关于f-strings优点的文章,从它们的自然语法到它们带来的性能改进。我觉得没有必要重复这些观点,我只想说这是一个神奇的功能,自从它们发布后我就一直在使用。
但它引入的一个麻烦就是是编写print语句和logging语句之间的不一致。logging 模块很棒,当关闭日志消息时,默认是不会格式化字符串。所以你可以这样写: x = 3
logging.debug(‘x=%d’,x)
如果将日志级别设置为DEBUG,则输出x=3,但如果将日志级别设置为更高,则甚至不会执行字符串插值。
这是因为logging.debug是一个函数,字符串作为参数传递。你可以在易读的C源代码中看到它是如何工作的。但是,如果你编写以下代码,这个功能就会消失:
x=3
1ogging.debug (f'x={x}')
无论日志级别如何,字符串插值都会发生。这在语言层面上是有意义的,但是在我的工作流程中实际的结果却是令人恼火的。调试代码时,我首先编写print语句,当一切正常时,我随后将它们转换为logging语句。因此,每个打印语句必须手工重写,