Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。
这个月早些时候我在加拿大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语句。因此,每个打印语句必须手工重写,以适应不同类型的字符串插值。我不知道如何解决这个问题,但我想把它指出来,因为我还没有看到其他人写过这个问题。
缺点
对于其他和Python一样久存在的项目 (哇,它和我一样古老),有一些模块和思想正在显示它们的年龄。这并不是一场历史发掘比赛,但是通过解决挑战,我们可以说我们作为一个社区可以做得更好。
tox
Tox仍然是python大陆中最好的(或者更准确地说,实际上是最好的)测试运行程序,但是它非常糟糕。不仅tox.ini的语法文件有点不直观,工具也非常慢。这不是tox的错,整个setup.py系统设计就是有问题的。因为这些文件声明包依赖关系,同时可以执行代码,发现依赖关系本质上是缓慢的。这导致许多工具运行缓慢。我相信这是我们作为一个社区在2019年应该解决的问题。
另外,目前还没有Pipfile支持,这使得使用它的价值主张大大降低。与所有事情一样,重要的不是这个想法有多好,而是围绕它的工具支持。
类型注释仅适用于工具
引用自 PEPO484:
▋使用类型提示进行性能优化留给读者自行练习。
考虑到编写PEP时Python的状态,这是可以理解的,但是现在是时候继续了。我们已经成功地转换到Python3,并且PyPi上最常下载包中的359 /360个包也已经兼容Python3。类型提示包已经存在了,并且深受社区喜爱。更进一步,Python类型提示应该带来额外的好处,比如性能优化和自动运行时类型断言。我发现运行时类型断言非常有用(特别是在库中),而且手动写起来很麻烦。对于类型提示,这尤其令人讨厌,因为你必须维护多个类型真源。
正如其他人所写的,Python 4可能将JIT作为一级特性。这似乎是提出一个逻辑位置来添加性能优化,以此作为对类型注释的响应。
变量可变性
我现在对Python最大的抱怨之一是缺少const或类似的东西。在我编写代码时所犯的所有错误中,有固定90%都可以追溯到与类型相关的错误(现在我的程序主要出现此错误)或当我认为我在创建一个新变量时,在同一个函数中意外地重用以前的变量的错误。我知道有处理这些的包,但是我想让const成为首选。
nbconvert
nbconvert项目总的来说是令人惊叹的。它允许Jupyter笔记本转换成其他各种格式,包括PDF,Reveal.js幻灯片,或可执行脚本。在过去的几个月里,我广泛地使用了最后两种方法,它们确实改变了我的工作流程。我可以把Jupyter笔记本整理在一起,然后在最后一刻把它们转换成每周和同事开会用的报告,来展示我的进步。同样,我可以在notebook中开发一个想法,然后将其转换为脚本,并以最小的更改将其用于生产环境。
不管怎样,这就是我的想法。实际情况是,从任何一个大型笔记本中生成的脚本都需要大量的手工转换,因此使用剪切粘贴从头开始编写脚本是值得的。我从一些公司听说,他们已经围绕nbconvert创建了一些包装程序,使之更加实用。我鼓励这些人开源这些贡献,哪怕只是为了减轻我个人的痛苦。
结论
许多优秀的人鼓励我写这篇文章,我感谢他们的反馈和支持。如果你不同意,请随时在Iwitter上给我留言。如果你感受到我的痛苦,请在Hacker News讨论区留下你的不满故事。
脚注
这些只是我上个月用过的。肯定还有更多完整的列表,例如typeshed type-stubs-request标记。英文原文:https://qiniumedia.freelycode.com/vcdn/1/优质文章长图2/state_of_python_in_2018.pdf
译者:一瞬