我知道我不是唯一一个对这个话题发表看法的人,这次该轮到我了。

不久前,我在Twitter上暗示,我对Python的未来有想法。这里不是重复那个帖子,但那个帖子是我分享本文想法的重要背景。

如果你期待本文是一篇严肃的研究论文,里面充满了对同行们的各种文献引用,那你就找错了地方。同样,如果你希望我做的是公正客观的分析,也找错了地方。我甚至不打算对文中的定义做任何外部链接,这就是站在临时讲台上的我,你可以选择观看也可以选择离开。

我还特意不谈论CPython运行时间、包管理器pip、虚拟环境或PyPI生态系统,这就是一篇关于Python语言的、包含着我的个人价值观的文章。

我希望你能理解为什么有些编程语言比其他语言感觉更好,即使你不认同Python比大多数语言都好。

image-7

须知

是什么使Python成为一门伟大的语言?回答这个问题,需要具备全方位认知的能力。

看到标题中“须知”,我就想到在军队里,“须知”会被经常提及,它可能让你感到被强制、保密等,但即使在感觉起来或实际上就是这样糟糕的情况下,我们的目的也是为了然你关注下面的内容。

在一个军事组织中,每个人都需要经常做出生死抉择。你花在每一个选择上的时间越多,你就越有可能选择死亡(特别是你自己的死亡)。如果在每一项决策中都考虑各种道德因素,决策过程会非常低效。

因为没有一支军队想失去自己的士兵,所以他们通过一系列的等级来进行决策。当个人出现在战场上的时候,最大的决定已经做出了,而士兵自己做决定的范围非常狭窄。他们可以专注于自己需要知道的事情,对于其他任何不需要知道的事情,就相信上级已经深思熟虑过了。

软件开发中的库或者抽象的各种接口,与之类似。某个开发者已经殚精竭虑,为我们提供了需要知道的内容。我们要做的就是专注于自己的工作,相信其他事情都已经解决了。

image-8

内存管理可能是最简单的例子。自动管理内存(例如使用垃圾收集器)的语言已经为你做出决定,你就不需要知道。这样,你就赢得了更多时间,聚焦于你的实际业务。

“须知”有不好用的时候吗?当然有,有时你需要了解得更多才能做出一个好的决定。在军事组织中,有获取更多信息的途径和方法,还有针对拒绝服从命令的制度安排(对拒绝的人来说,结果往往不太好,但是,有这方面的通道)。

在软件中,“须知”在某些情况下会失效,比如你想得到没有公开的文档,你想对库或接口的源代码进行修改,或执行一些超出文档范围的操作。当这些情况出现时,不能为你提供更多相关信息,就会成为后续开发的严重障碍。

全面地认识“须知”,有利于你集中精力完成工作,同时也能在必要时找到应急出口,处理你需要知道更多信息的业务。Python很好地实现了这种平衡。

Python中的层级

在Python中,有很多层级,包括“须知”。

在最上层,有基本语法和最琐碎的赋值、属性和函数调用等,这些概念及其与项目上下文的结合,足以编写出高效代码。

下面的示例,是生成一些随机数,然后绘制直方图。据我所知,只有两个不同的词不特定于这个任务(importas),它们用于引入模块——很可能是作者复制过来的,不是自己写的。除此之外,代码中的其他所有内容都与指定随机分布和绘图密切相关。

image-9

代码中最复杂的概念是元组拆封,但对于用户,只需要知道能得到多个返回值即可。事实上,只有一个返回值,并且通过赋值来执行拆封,这并不是必须要知道的,或者,也不是有用的东西。

找一个非开发者,用他做个实验:向他们展示x, y = get_points(),并解释它的工作原理,而不要提到它返回了多个值。然后指出get_points()实际上只返回两个值,而x, y =是给它们命名的方式。结果证明,他不需要知道这个函数的工作原理,只需要知道它的作用。

类的模式,一直在重复,例如:解释for x in y:的含义,可以(而且应该)不必提及迭代器;说明open()的作用,可以(而且应该)不必提及io模块;讲解类实例化的过程,可以(而且应该)不必提及__call__;等等。

Python非常有效地向那些只想使用它的人隐藏了不必要的细节。

想想你用过的其他语言,你需要多少概念实现上面的例子?

基本上所有其他语言都会区分声明变量和分配变量。许多语言都需要先定义类型,在赋值之前要了解对象类型。Python只需要使用三个概念就能够生成随机数的直方图,我想不出有哪种语言比Python需要的这三个概念还要少(同时从上到下可读性非常强——我想到了LISP)。

image-10

超越“须知”

但当“须知”失效的时候,Python提供了在整个软件行业中最好的逃生通道。

首先,没有真正的私有成员,你在Python程序中使用的所有代码都属于你,你可以阅读、修改、封装、发布,没有人阻止你,这是你的计划。鸭子类型在这里表现得非常出色,它提供了新的方法来克服在其他语言中根本不可能实现的限制性抽象。

你应该养成这样做的习惯吗?当然不是。你使用库是有原因的——将“须知”的决策委托给其他人来帮助你专注于自己的代码。如果你经常质疑和忽视他们的决定,你就完全破坏了你可能得到的任何好处。但Python也允许你依赖其他人的代码,而无需受制于他们的选择。

今天,Python生态系统几乎完全是公开可见的代码。你不需要知道它是如何运行的,但是你可以选择去发现。你可以按照你熟悉的模式来探索,而不必学习全新的技能。阅读Python代码,或者在交互模式中尝试,用你的代码做你自己的事情。

如果将Python与那些号称编译的、压缩打包代码的语言比较,在了解真实工作过程的来龙去脉上会有非常不同的体验。

如果将Python与那些号称信息隐藏、封装和强类型的语言相比较,将在克服中断的或限制性的抽象方面有非常不同的经验。

不“须知”的功能

在前面的绘图示例中,除了赋值、属性和函数调用之外,你不需要了解任何其他信息。为了使用Python,你还需要了解多少?谁需要了解这些额外的东西呢?

事实证明,有数以百万计的Python开发者只需要赋值、属性和函数调用的知识,在Python社区中有1%的人使用Twitter和邮件列表,喜欢没完没了地谈论难以置信的高级功能,比如赋值表达式和位置参数等。事实是,大多数Python用户从来不需要这些东西,也从来不必关心这些。

当我教授Python编程入门课程时,我的主题顺序大致是赋值、计算、函数调用(为了调动有趣)、内置对象类型、for循环、if语句、异常处理,也许还有一些简单的自定义函数和装饰器。这对于90%的Python工作来说应该足够了。

更深一层的东西很有趣的。Python的更高级别,就是10%的开发者为另外90%的开发者提供更多的功能,即上述基本知识,这些不需要人们更新对语言的理解,那些超级好用的库是虽然由大牛们编写的,但是发布的语法和调用方法都是最简单。

image-11

假设我就是大牛,如果我应用了类、运算符重载、生成器、自定义对象类型、类型检查等,Python不会强制我的用户也使用它们;如果我关注的范畴扩展了,复杂度也提升了,我会做出一些决定来保护我的用户按“须知”行事。

例如,我的用户知道调用什么会返回一个值,并且返回的值具有某些属性或方法。在Python中,可调用的是函数还是类对语法没什么影响,但是与大多数其他语言相比,如果我把调用的函数改成类,就必须改变语法。

当我更改函数以返回自定义的映射类型而不是标准字典时,对用户没什么影响。在其他语言中,返回类型也是在我的用户代码中显式指定的,因此即使是兼性更新,也超出了用户真正所需知识的范围。

如果我返回一个类似数字的对象,而不是一个内置整数,那么我的用户不需要知道。大多数语言都没有任何方法来替换原始类型,但是Python提供了创建类数字对象所需的所有功能。

显然,即使在这个层面上,复杂性也提升了不少。但与大多数其他语言不同,不会更复杂了。你的代码库中使用了一些复杂的东西,但不意味着你不得不在任何地方都那么做。

再深入一层,可以增加更多的复杂内容,但是它们会被隐藏在正常语法后面。元类、对象工厂、装饰器、接口、属性拦截等等,允许开发者从更底层开始重写某些对象,这些内容可能只有1%的Python开发者需要了解,而应该使用这些功能的人可能更少。但是,在拥有如此平易近人的实现底层操作的语言中,Python的这些特性是独一无二的。

即使上面的层级划分是荒谬的,对于同等级的操作,在众多语言中,只有Python才能做到。Python中各类对象类型基于这些特性,但使用它们所需的知识与创建它们所需的知识不同。用户要专注于他们正在做的事情,相信别人已经对他们需要知道的事情做出了正确的决定。

总结与遐想

人们经常把Python的生态系统作为其流行的主要原因,还有一些人则认为Python的简洁或表达能力是主要原因。

我认为Python语言对开发者需要知道的东西有一种令人难以置信的权衡透析,比我用过的任何一种语言都好。

大多数开发者只需使用很少的语法结构就可以编写功能强大、重点突出的代码。有一些开发人者编写可重用的代码,并可以通过简单的语法来使用这些代码。少数高级开发者管理着难以置信的复杂的源码库,以便在语言允许的范围内提供强大的新功能。

高级程序员编写复杂代码开发一些库和包,让其他人编程不再复杂,Python已经构建起了一个令人惊叹的生态系统,这种令人惊叹的生态系统正推动着Python语言的普及。

但是,这个生态系统的寿命会有多久?Python语言是否具备在不断变化的生态系统中生存的能力?流行的库会继续推动Python语言的流行吗?有什么地方需要改变吗?

原文:https://stevedower.id.au/blog/python-a-great-language/