推荐学习书目
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 · May 6, 2021 · 4195 views
    This topic created in 1846 days ago, the information mentioned may be changed or developed.

    QQ 截图 20210506214449.png

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

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

    Supplement 1  ·  May 7, 2021

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

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

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

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

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

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

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

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

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

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

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

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

    新版本里的 match 、嵌套 with 都是很好用的语法糖啊,如果能编译到低版本代码,那现在大家就可以用了,而不是等到五年后各个基础设施版本都上来了才能用。
    laike9m
        18
    laike9m  
       May 7, 2021
    @abersheeran 我感觉 Python 版的 babel 也不难做,可能只是 Python 圈子没这种文化吧🤣
    abersheeran
        19
    abersheeran  
    OP
       May 7, 2021 via Android
    @laike9m 是啊。不过,我记得 PyPi 有 babel,是个 i18n 用的库。
    hsfzxjy
        20
    hsfzxjy  
       May 7, 2021 via Android
    感觉如果 bytecode 兼容的话,可以只部署 bytecode 。(当然像 match 这种是不兼容的)
    chaleaoch
        21
    chaleaoch  
       May 7, 2021
    这...Java 里没这个问题吗?
    zouzou0208
        22
    zouzou0208  
       May 8, 2021
    @abersheeran 我记得是 3.8 放宽的,之前也遇到这个问题了。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1291 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 17:25 · PVG 01:25 · LAX 10:25 · JFK 13:25
    ♥ Do have faith in what you're doing.