V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
chinesehuazhou
V2EX  ›  Python

聊聊 Python 的内置电池

  •  
  •   chinesehuazhou · 2019-06-15 17:51:06 +08:00 · 2299 次点击
    这是一个创建于 1775 天前的主题,其中的信息可能已经有所发展或是发生改变。

    (一)

    最近,我突然想到一个问题:相比其它语言,有哪些概念或习惯叫法是 Python 特有的?

    在朋友圈提出这个问题后,我得到最多的回复是——Pythonic 。这个回复一点都不意外,名字中自带 Python 的,当然是特有的啦,与它相似的,还有 Pythonista

    这两个词是啥意思呢? Python 圈内流传着一个说法“人生苦短,我用 Python ”,人们相信存在着最佳的实践方式,采用这种方式是最美的、最高效的、最优雅的,也即是 Pythonic,而这样做的人(或以此为追求的人)则自称是 Pythonista。这个称号是有别于 Pythoner 或者 Pythonist 的,简单地说就是,它更有追求、更有逼格。

    除了以上两个,Python 还有众多独特的叫法,例如终生仁慈独裁者、装饰器、上下文管理器、推导式与生成式、鸭子类型、猴子补丁、魔术方法、GIL、内置电池,等等。它们有的并不是 Python 所原创或独有,但是却因为它才广为人知,它们在 Python 中是代表性的存在物。

    (二)

    这些内容都很有意思,本文唯独想聊聊它——内置电池

    Batteries Included 这个叫法是 Python 特有的,它指的是 Python 拥有“内置电池”,也就是自带丰富多样的标准库,开箱即用,动力十足。

    在《 PEP 206 -- Python Advanced Library 》中,它提出了“内置电池的哲学”( Batteries Included Philosophy ):拥有丰富而通用的标准库,无需用户单独下载就能立即使用。还说这使得 Python 领先于很多项目。

    根据官方文档显示,Python 内置了 200 多个标准库,类型丰富多样,包括字符处理、数据类型、数值计算、文件处理、并发执行、网络通信、多媒体服务、图形界面、调试与开发、以及操作系统专有服务等等。

    内置电池为 Python 提供了一种自给自足的能力( self-sufficient ),在大多数情况下,用户不需要再去下载和安装单独的软件包,因此也免去一大堆的依赖问题的折磨。

    (三)

    某些编程语言中也有内置电池的概念,例如 Perl、Ruby、PHP 等等,还有的语言会强调自己内置了强大的功能,例如 Erlang (一切皆进程)、Go ( goroutine 机制)。

    然而,这个叫法在 Python 中被叫得最响,也被推广到了技术生态中的其它项目里,几乎成了 Python 的专有名词。

    在维基百科上搜索“ Batteries Included ”,该条目有 4 个解释,其中之一表明它是 Python 的 Motto ,这个词的意思是座右铭、格言、箴言,足见分量之重了吧。

    (四)

    内置电池做不到无所不包,因此需要所谓的第三方库,而 Python 也以三方库丰富而闻名。

    PyPIPython Package Index 的简称,即 Python 库索引,是一个用来管理三方库的项目,根据网站显示,目前有 18 万个三方库,以及它们的 135 万个发行版本。

    就是说,Python 也拥有强大的外置电池,所以其实它是 双驱动 的。

    (五)

    双驱动本来相安无事,互为表里,但是,内置电池却遭到了越来越多的指责。

    在今年 5 月的官方 PyCon 大会上,演讲嘉宾 Amber Brown 做了专门的分享,主要话题就是吐槽这内置电池正在“漏电”( Leaking ):

    • 应用程序需要的不仅仅是标准库
    • 质量差,功能落后,代码过时
    • 标准库模块排挤创新

    她的想法是移除一些标准库,例如 asyncio 及大多数的新特性,迁移到 PyPI,拥抱社区。这样做的预期效果是:内置电池会变得轻量小型化、高质量,同时三方库的生态系统也能得到进化。

    其他开发人员对这个话题也进行了讨论。

    标准库的维护团队表示,迁移部分模块的工作已经在展开了,但这需要经过仔细的设计,另外,不容忽视的是,迁移库到 PyPI 也要求测试配置的工作量。

    还有人提出反对意见,认为精简标准库可能会破坏下游代码,而且有的企业用户只信任标准库而排斥三方库,这无疑会增加用户的负担。

    (六)

    我们的很多电子设备都是由电池驱动的,虽然它们的形式与材质各种各样,但是不可避免会遇到老化的问题(某种手机甚至会爆炸)。

    Python 的内置电池也不例外,可是,这个电池的修理或替换,却不像物理世界的电池那般容易。

    官方在十几年前提出了 PEP-206 与 PEP-3108,那时核心开发者们就发现有些标准库容易被入侵、设计不佳、有更好的替代库,因此推荐了很多款第三方库,以作为标准库的替代选项。这些年来,很多废弃的库已退出舞台,但更多的新库也加了进来,革命尚未成功。

    今年 5 月,在 PyCon 大会引发的讨论之后,有开发者发起了 PEP-594,提议将“坏死的电池”( dead batteries )移出标准库。

    目前,该 PEP 仍处于草案( Draft )状态,但已基本成为社区共识。

    PEP 中提议移除工作从 Python 3.8 开始,因为它的发布时间刚好在 Python 2.7 停止维护之前,可以平滑地承接大版本迁移的用户。然后,按照有序的清理计划,最终在 Python 3.10 版本完成所有废弃模块的移除。

    也就是说,内置电池的“手术”加速了,未来几年里,这将成为一个常态。

    (七)

    内置电池的哲学助力了 Python 发展壮大,攻城略地,成为最主流的编程语言之一。

    然而它面临的挑战是:功能齐备与轻量可维的矛盾、官方支撑与社区分治的选择,因此,必然会走到今天的局面。

    正如任何大型项目都可能遇到内存泄漏与性能退化的问题一样,Python 这个项目也是。剔除坏死的组织,精兵简政,革故鼎新,跟上时代,这些是 Python 核心团队正在做的事。

    从去年末以来,我持续关注着 Python 最高决策层的选举,而在上个月,我恰好翻译了一篇文章《GIL 已经被杀死了么?》介绍了 GIL 的移除计划。

    这些事件都表明着一件事:Python 充满活力,大蟒蛇蜕皮后,将会迎来新生。

    我们何其幸运,正好作为见证者。其它就不用多说了,重温一下这个伟大的口号吧——人生苦短,我用 Python。

    声明:本文原创并首发于 [Python 猫] ,未经授权,请勿转载。

    lihongjie0209
        1
    lihongjie0209  
       2019-06-15 19:48:09 +08:00
    只看前几段就猜到了, 内置实现的方式必然会导致后续替换的问题.
    1010543618
        2
    1010543618  
       2019-06-15 20:52:53 +08:00
    外置电池的话不知道 JS NPM 有没有机会和 PyPI 一较高下
    bugcoder
        3
    bugcoder  
       2019-06-16 06:31:44 +08:00
    好巧,前几个星期,好几个国外的 podcast 都说过类似的内容。
    chinesehuazhou
        4
    chinesehuazhou  
    OP
       2019-06-16 08:55:40 +08:00
    @bugcoder 就是 5 月大会之后吧,还有因为 PEP-594。不过这个话题在国内没怎么见到讨论的,所以我就来聊聊了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1721 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:45 · PVG 00:45 · LAX 09:45 · JFK 12:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.