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
abersheeran
V2EX  ›  Python

吐槽一下 Python 版本的割裂

  •  1
     
  •   abersheeran · 2021-05-06 22:23:04 +08:00 · 3633 次点击
    这是一个创建于 1303 天前的主题,其中的信息可能已经有所发展或是发生改变。

    QQ 截图 20210506214449.png

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

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

    第 1 条附言  ·  2021-05-07 00:32:46 +08:00

    最后我妥协了,还是 @app.router.http.get("/{name}") 这么来吧。实现丑一点而已,用起来区别不是很大,只不过是 method 前置还是后置的区别。

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

    硬上 3.9 是不可取的。
    no1xsyzy
        5
    no1xsyzy  
       2021-05-07 00:22:23 +08:00
    PyCharm 可以开启兼容性检测来着
    abersheeran
        6
    abersheeran  
    OP
       2021-05-07 00:30:22 +08:00
    @no1xsyzy 呃,我就是想这么写啊。😭所以更想要一个转换器。这个其实可以通过 `@_(..................)` 这么写来解决的,但是手动这么写就很蠢,能自动编译过去比较舒服。
    hsfzxjy
        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
    ipwx
        8
    ipwx  
       2021-05-07 01:00:07 +08:00
    这倒也不是行不行,而是你的需求和大部分 python 程序员的需求实在太不一样了。。。

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

    个人觉得只支持新版本不是啥大问题,如果只是写个玩具项目的话
    ipwx
        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 小功能一般自己造轮子。
    ipwx
        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 了,后面很多功能都没有那么大提升。
    ipwx
        15
    ipwx  
       2021-05-07 10:59:35 +08:00
    …… 说这些不是说我古板,而是在我的印象里,我上面提到的这些大型库都是以 3.6/3.7 为基准的。这才是社区潮流,比最新版 Python 落后一些身位吧。。。
    ipwx
        16
    ipwx  
       2021-05-07 11:01:04 +08:00
    最后,真要是没有会死的功能,我见过很多 backports 。比如 py 3.6 的 dataclass 当年就有 backport 到 3.x 的版本:

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

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

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

    新版本里的 match 、嵌套 with 都是很好用的语法糖啊,如果能编译到低版本代码,那现在大家就可以用了,而不是等到五年后各个基础设施版本都上来了才能用。
    laike9m
        18
    laike9m  
       2021-05-07 12:14:43 +08:00
    @abersheeran 我感觉 Python 版的 babel 也不难做,可能只是 Python 圈子没这种文化吧🤣
    abersheeran
        19
    abersheeran  
    OP
       2021-05-07 12:15:40 +08:00 via Android
    @laike9m 是啊。不过,我记得 PyPi 有 babel,是个 i18n 用的库。
    hsfzxjy
        20
    hsfzxjy  
       2021-05-07 12:16:11 +08:00 via Android
    感觉如果 bytecode 兼容的话,可以只部署 bytecode 。(当然像 match 这种是不兼容的)
    chaleaoch
        21
    chaleaoch  
       2021-05-07 20:05:52 +08:00
    这...Java 里没这个问题吗?
    zouzou0208
        22
    zouzou0208  
       2021-05-08 08:46:27 +08:00
    @abersheeran 我记得是 3.8 放宽的,之前也遇到这个问题了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2696 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 12:09 · PVG 20:09 · LAX 04:09 · JFK 07:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.