吐槽一下 Python 版本的割裂

2021-05-06 22:23:04 +08:00
 abersheeran

偶然想到的 Idea,在保证了向前兼容的情况下,友好的拓展了功能糖。我本地是 3.9 的,这么写完全没问题。然后我的 black 格式检查一直报错说解析不了这个语句,我突然想到之前看 ChangeLog,3.9 好像放宽了装饰器的要求,遂把版本切回 3.7 一看,果然不行。

哭了。Python 什么时候才有那种可以转换代码到指定版本的工具啊(自己试图弄过,相关知识缺口很大,一时半伙搞不出来)。

3541 次点击
所在节点    Python
22 条回复
Jirajine
2021-05-06 22:41:17 +08:00
因为没有需求,py 不像 js 那样客户端版本不可控,所以也就没有类似 babel 这样的转译工具。
abersheeran
2021-05-06 22:42:11 +08:00
@Jirajine 开源轮子作者很需要这种的,哭了。
Jirajine
2021-05-06 22:52:17 +08:00
@abersheeran 没必要啊,用了新特性就提高最低版本要求呗,py3.* 多数情况都是向前兼容的,迁移不算太大问题。
反倒是前端的转译、bundle 和 polyfill 才比较割裂,即使用了 modern browser,也要跑针对古老浏览器打包的代码。
abersheeran
2021-05-06 22:59:19 +08:00
@Jirajine hhh 开源项目总得把 LTS 的几个版本给支持了。比如现在,一般项目都支持 3.6-3.9 ( 3.10 ),大部分 Serverless 服务提供商都是只支持 3.6 的,其他的版本得自己搞 runtime 。

硬上 3.9 是不可取的。
no1xsyzy
2021-05-07 00:22:23 +08:00
PyCharm 可以开启兼容性检测来着
abersheeran
2021-05-07 00:30:22 +08:00
@no1xsyzy 呃,我就是想这么写啊。😭所以更想要一个转换器。这个其实可以通过 `@_(..................)` 这么写来解决的,但是手动这么写就很蠢,能自动编译过去比较舒服。
hsfzxjy
2021-05-07 00:57:22 +08:00
我还遇过小版本的 breaking change

之前一直用 3.8.5,然后有一天 yapf 突然不工作了,检查发现是代码中用了 positional only parameters,但 yapf 底层 parser 是 lib2to3 还没有完全支持新语法,解决方案是升 3.8.7 /doge
ipwx
2021-05-07 01:00:07 +08:00
这倒也不是行不行,而是你的需求和大部分 python 程序员的需求实在太不一样了。。。

大部分程序员要么想办法升级 python 到 3.9 (反正 forward compatibility 很好,3.6 -> 3.9 代码大概不用改一行),要么用 3.6 语法。你这需求。。。。实在没有人需要,所以要么自己造轮子,要么别头上长角。
hsfzxjy
2021-05-07 01:00:27 +08:00
3.9 是个分水岭,开始改用 PEG Parser,感觉一众 Formatter 像 yapf 如果还在用 LL1 Parser,得过好久才能跟上新语法
abersheeran
2021-05-07 01:01:54 +08:00
@hsfzxjy 我也遇见过,不过幸好是公司项目,升级就解决了。
abersheeran
2021-05-07 01:03:17 +08:00
@ipwx 咋说呢,这也不是我一个人这么想,还是有不少 Python 第三方库的开发者这么想过,但是 Python 社区你懂的,大都是散兵游勇,一个工作量很大的想法到落地,要很久的。
laike9m
2021-05-07 01:37:55 +08:00
@abersheeran Python 没有 LTS,是滚动支持的。3.6 今年年底就要结束支持了。具体参见:
https://endoflife.date/python

个人觉得只支持新版本不是啥大问题,如果只是写个玩具项目的话
ipwx
2021-05-07 10:57:02 +08:00
@abersheeran ummm 我觉得你这个不少第三方库的作者。。。 真的能代表一种趋势吗?

Python 社区并不是散兵游勇啊,至少 Python 库的集中度比 JS 社区好很多吧?真的大量使用的库也就屈指可数:NumPy, Pandas, Matplotlib; Scikit-Learn, TensorFlow, PyTorch; Flask, FastAPI, SQLAlchemy; Click

诸如此类的。比起 JS 动不动 import 一个库,我写 Python 小功能一般自己造轮子。
ipwx
2021-05-07 10:58:25 +08:00
…… 然后我写很多代码都是以某个比较稳定的版本作为基准的,比如我现在习惯定在 Python 3.6/3.7 。不强求支持 3.6,但是单元测试保证 3.7 ~ 3.8 。3.9 我都还没测过呢。

主要是 3.6+ 就有 f-string,type annotation,async 了,后面很多功能都没有那么大提升。
ipwx
2021-05-07 10:59:35 +08:00
…… 说这些不是说我古板,而是在我的印象里,我上面提到的这些大型库都是以 3.6/3.7 为基准的。这才是社区潮流,比最新版 Python 落后一些身位吧。。。
ipwx
2021-05-07 11:01:04 +08:00
最后,真要是没有会死的功能,我见过很多 backports 。比如 py 3.6 的 dataclass 当年就有 backport 到 3.x 的版本:

https://pypi.org/project/dataclasses/

而遇到 async 这种超级语法增强,那你除了升版本还有啥办法?
abersheeran
2021-05-07 12:06:50 +08:00
@laike9m 嗯嗯 只是顺手沿用了一下其他玩意的说法。滚动这个我是知道的。

没有我说的那种编译工具,新版本的语法糖就没法在旧版本用了啊。比如我上次想把代码丢到 Serverless 里跑,结果人家自带的只支持 2.7 和 3.6,我又苦哈哈的把 := 还有 to_thread 之类的给删掉了。当然,那是写着玩的,改起来很简单,不过还是很不爽啊。

新版本里的 match 、嵌套 with 都是很好用的语法糖啊,如果能编译到低版本代码,那现在大家就可以用了,而不是等到五年后各个基础设施版本都上来了才能用。
laike9m
2021-05-07 12:14:43 +08:00
@abersheeran 我感觉 Python 版的 babel 也不难做,可能只是 Python 圈子没这种文化吧🤣
abersheeran
2021-05-07 12:15:40 +08:00
@laike9m 是啊。不过,我记得 PyPi 有 babel,是个 i18n 用的库。
hsfzxjy
2021-05-07 12:16:11 +08:00
感觉如果 bytecode 兼容的话,可以只部署 bytecode 。(当然像 match 这种是不兼容的)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/775297

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX