偶然想到的 Idea,在保证了向前兼容的情况下,友好的拓展了功能糖。我本地是 3.9 的,这么写完全没问题。然后我的 black 格式检查一直报错说解析不了这个语句,我突然想到之前看 ChangeLog,3.9 好像放宽了装饰器的要求,遂把版本切回 3.7 一看,果然不行。
哭了。Python 什么时候才有那种可以转换代码到指定版本的工具啊(自己试图弄过,相关知识缺口很大,一时半伙搞不出来)。
最后我妥协了,还是 @app.router.http.get("/{name}")
这么来吧。实现丑一点而已,用起来区别不是很大,只不过是 method 前置还是后置的区别。
1
Jirajine 2021-05-06 22:41:17 +08:00 via Android
因为没有需求,py 不像 js 那样客户端版本不可控,所以也就没有类似 babel 这样的转译工具。
|
2
abersheeran OP @Jirajine 开源轮子作者很需要这种的,哭了。
|
3
Jirajine 2021-05-06 22:52:17 +08:00 via Android
@abersheeran 没必要啊,用了新特性就提高最低版本要求呗,py3.* 多数情况都是向前兼容的,迁移不算太大问题。
反倒是前端的转译、bundle 和 polyfill 才比较割裂,即使用了 modern browser,也要跑针对古老浏览器打包的代码。 |
4
abersheeran OP @Jirajine hhh 开源项目总得把 LTS 的几个版本给支持了。比如现在,一般项目都支持 3.6-3.9 ( 3.10 ),大部分 Serverless 服务提供商都是只支持 3.6 的,其他的版本得自己搞 runtime 。
硬上 3.9 是不可取的。 |
5
no1xsyzy 2021-05-07 00:22:23 +08:00
PyCharm 可以开启兼容性检测来着
|
6
abersheeran OP @no1xsyzy 呃,我就是想这么写啊。😭所以更想要一个转换器。这个其实可以通过 `@_(..................)` 这么写来解决的,但是手动这么写就很蠢,能自动编译过去比较舒服。
|
7
hsfzxjy 2021-05-07 00:57:22 +08:00 via Android
我还遇过小版本的 breaking change
之前一直用 3.8.5,然后有一天 yapf 突然不工作了,检查发现是代码中用了 positional only parameters,但 yapf 底层 parser 是 lib2to3 还没有完全支持新语法,解决方案是升 3.8.7 /doge |
8
ipwx 2021-05-07 01:00:07 +08:00
这倒也不是行不行,而是你的需求和大部分 python 程序员的需求实在太不一样了。。。
大部分程序员要么想办法升级 python 到 3.9 (反正 forward compatibility 很好,3.6 -> 3.9 代码大概不用改一行),要么用 3.6 语法。你这需求。。。。实在没有人需要,所以要么自己造轮子,要么别头上长角。 |
9
hsfzxjy 2021-05-07 01:00:27 +08:00 via Android
3.9 是个分水岭,开始改用 PEG Parser,感觉一众 Formatter 像 yapf 如果还在用 LL1 Parser,得过好久才能跟上新语法
|
10
abersheeran OP @hsfzxjy 我也遇见过,不过幸好是公司项目,升级就解决了。
|
11
abersheeran OP @ipwx 咋说呢,这也不是我一个人这么想,还是有不少 Python 第三方库的开发者这么想过,但是 Python 社区你懂的,大都是散兵游勇,一个工作量很大的想法到落地,要很久的。
|
12
laike9m 2021-05-07 01:37:55 +08:00 via Android
@abersheeran Python 没有 LTS,是滚动支持的。3.6 今年年底就要结束支持了。具体参见:
https://endoflife.date/python 个人觉得只支持新版本不是啥大问题,如果只是写个玩具项目的话 |
13
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 小功能一般自己造轮子。 |
14
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 了,后面很多功能都没有那么大提升。 |
15
ipwx 2021-05-07 10:59:35 +08:00
…… 说这些不是说我古板,而是在我的印象里,我上面提到的这些大型库都是以 3.6/3.7 为基准的。这才是社区潮流,比最新版 Python 落后一些身位吧。。。
|
16
ipwx 2021-05-07 11:01:04 +08:00
最后,真要是没有会死的功能,我见过很多 backports 。比如 py 3.6 的 dataclass 当年就有 backport 到 3.x 的版本:
https://pypi.org/project/dataclasses/ 而遇到 async 这种超级语法增强,那你除了升版本还有啥办法? |
17
abersheeran OP @laike9m 嗯嗯 只是顺手沿用了一下其他玩意的说法。滚动这个我是知道的。
没有我说的那种编译工具,新版本的语法糖就没法在旧版本用了啊。比如我上次想把代码丢到 Serverless 里跑,结果人家自带的只支持 2.7 和 3.6,我又苦哈哈的把 := 还有 to_thread 之类的给删掉了。当然,那是写着玩的,改起来很简单,不过还是很不爽啊。 新版本里的 match 、嵌套 with 都是很好用的语法糖啊,如果能编译到低版本代码,那现在大家就可以用了,而不是等到五年后各个基础设施版本都上来了才能用。 |
18
laike9m 2021-05-07 12:14:43 +08:00
@abersheeran 我感觉 Python 版的 babel 也不难做,可能只是 Python 圈子没这种文化吧🤣
|
19
abersheeran OP @laike9m 是啊。不过,我记得 PyPi 有 babel,是个 i18n 用的库。
|
20
hsfzxjy 2021-05-07 12:16:11 +08:00 via Android
感觉如果 bytecode 兼容的话,可以只部署 bytecode 。(当然像 match 这种是不兼容的)
|
21
chaleaoch 2021-05-07 20:05:52 +08:00
这...Java 里没这个问题吗?
|
22
zouzou0208 2021-05-08 08:46:27 +08:00
@abersheeran 我记得是 3.8 放宽的,之前也遇到这个问题了。
|