V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
szzhiyang
V2EX  ›  程序员

同是静态类型检查,为什么 Python 圈对 Type Hints 的重视程度明显不及前端圈对 TypeScript 的重视程度?

  •  1
     
  •   szzhiyang · 2019-10-08 12:45:22 +08:00 via iPhone · 7194 次点击
    这是一个创建于 1877 天前的主题,其中的信息可能已经有所发展或是发生改变。
    68 条回复    2019-10-09 13:34:27 +08:00
    reus
        1
    reus  
       2019-10-08 12:53:51 +08:00 via Android
    请定义“重视”
    iyaozhen
        2
    iyaozhen  
       2019-10-08 12:55:58 +08:00
    主要是 Python 的 Type Hints 可用可不用,就像写注释一样,很麻烦,很难约束。
    但 TypeScript 基本上是换了语言,要用都得用了
    Mohanson
        3
    Mohanson  
       2019-10-08 12:56:23 +08:00 via Android
    type hints 是类型 “标注”, 不是检查, 目前来讲 hints 相当于注释。
    laike9m
        4
    laike9m  
       2019-10-08 12:58:42 +08:00 via Android
    随着大部分公司抛弃 py2,未来 type hints 会逐渐普及的
    szzhiyang
        5
    szzhiyang  
    OP
       2019-10-08 13:02:49 +08:00 via iPhone
    @reus 与前者相关的讨论、文档和博文明显少于后者,与前者配套的工具链明显逊于后者。
    abcbuzhiming
        6
    abcbuzhiming  
       2019-10-08 13:07:11 +08:00   ❤️ 9
    前端圈为啥重视 TS,说白了就是因为前端的项目越来越复杂,复杂到一个人在工作量上搞不定,必须和人协作,和人协作这个痛点逼迫大家不得不正规化,动态脚本的痛点在需要和人协作时暴露的非常明显,这才是 ts 在前端攻城略地的原因。而 python 大部分人都是用来写一些小工具,当然没那么讲究。只有痛彻灵魂,才会引起改变,几年前前端圈的 js 脚本小子讨厌 ts 的类型约束的人少了吗?说白了是被现实打脸抽痛了,才会明显类型约束的重要。否则的话 var 一把梭多舒服,这样想的人有的是
    LokiSharp
        7
    LokiSharp  
       2019-10-08 13:07:50 +08:00
    等 py4 出来 type hints 不再是注释之后就会普及了
    XIVN1987
        8
    XIVN1987  
       2019-10-08 13:10:14 +08:00
    Python 永远都是动态语言,Type Hints 只是为了统一类型标注语法,从而方便在不同的编辑器中实现自动补全
    optional
        9
    optional  
       2019-10-08 13:12:17 +08:00
    TypeScript 不仅仅是 type hints.
    ps1aniuge
        10
    ps1aniuge  
       2019-10-08 13:19:21 +08:00
    围观,我对 python 癌症的吐槽 https://www.cnblogs.com/piapia/p/11175865.html
    szzhiyang
        11
    szzhiyang  
    OP
       2019-10-08 13:31:11 +08:00 via iPhone
    @abcbuzhiming 有道理,不过工程复杂且需要多人协同完成的 Python 项目应该也不少吧,毕竟也有不少公司用 Python 写后端。
    szzhiyang
        12
    szzhiyang  
    OP
       2019-10-08 13:33:32 +08:00 via iPhone
    @optional 嗯嗯,我知道的。
    whileFalse
        13
    whileFalse  
       2019-10-08 13:50:24 +08:00
    @LokiSharp 然后 py3 和 py4 又并行多年。
    abcbuzhiming
        14
    abcbuzhiming  
       2019-10-08 14:06:47 +08:00   ❤️ 1
    @szzhiyang 绝对数量上,肯定不少,但是要谈比例,你应该听过那句话:python 后端在现在就是不入流,它能写,但是旁边 java,php,go 甚至 node 都斜着眼睛看着你。python 用的最多的地方还是科学计算,数据分析,一般都是小型脚本,个人完成
    gamexg
        15
    gamexg  
       2019-10-08 14:09:16 +08:00
    后端如果强依赖于静态类型,可以直接换成其他的强类型语言。
    而前端没得选,只能强化 js。
    aptx4689
        16
    aptx4689  
       2019-10-08 14:16:28 +08:00   ❤️ 10
    @ps1aniuge 这文章写得毫无水平,且不论文章错字一堆,很多问题无非是作者水平没达到。

    开头的“仅从 shell”角度出发,到后面也开始随心所欲想写啥就写啥,充斥个人牢骚。

    且不论你用个破解还大言不惭写上去当成缺点,连文档中文英文也要批判一番了。
    ChristopherWu
        17
    ChristopherWu  
       2019-10-08 14:26:39 +08:00
    @laike9m #3 主要是 type hints,py 官方不支持强校验。。。
    neoblackcap
        18
    neoblackcap  
       2019-10-08 14:39:20 +08:00
    我认为 Python 的 Type Hint 并不是很重要。有没有其实也差不多。
    后端业务成熟了,稳定了本来就会进行重写。重写可以用更高效的语言,毕竟稳定的业务就相当于基础组件。静态语言类型都是强制的。
    momocraft
        19
    momocraft  
       2019-10-08 14:41:27 +08:00
    py 不够混乱
    wysnylc
        20
    wysnylc  
       2019-10-08 14:42:46 +08:00
    @abcbuzhiming #6 说到点了
    bilibilifi
        21
    bilibilifi  
       2019-10-08 15:34:27 +08:00 via iPhone
    cython 就是强制类型检查
    JerryCha
        22
    JerryCha  
       2019-10-08 15:37:45 +08:00
    你 Web 前端除了 JS 还有其他选择?
    后端需要强类型直接就换语言,大不了 007。
    szzhiyang
        23
    szzhiyang  
    OP
       2019-10-08 15:54:23 +08:00
    @abcbuzhiming 明白了,非常感谢你的热心解答!
    laike9m
        24
    laike9m  
       2019-10-08 16:10:50 +08:00 via Android
    @ChristopherWu 把 type checker 的报错弄成强制的就好了呀,必须没有错误才能提交代码。当然代码风格(什么时候要加 hints )也必须要规定就是了。
    watsy0007
        25
    watsy0007  
       2019-10-08 16:14:08 +08:00
    ts 的重视因为是一门新语言, 然后翻译成 js 执行.

    python 自带 typing, 但是并不是强制的.
    love
        26
    love  
       2019-10-08 16:32:22 +08:00
    有人用过吗?这个现在表达能力完备吗?比起 TS 怎样?
    ayase252
        27
    ayase252  
       2019-10-08 16:40:10 +08:00
    一些库因为还要兼容 2.x,3.6 以下,type hints 加不上去。没有 type hints 很蛋疼,在 VSC 下写没有智能提示。
    TS 没有兼容性负担,库可以由社区驱动写 d.ts 或者直接升级到 TS。反正最后要编译成 JS,旧项目也不会出问题。
    ChristopherWu
        28
    ChristopherWu  
       2019-10-08 16:47:58 +08:00
    @laike9m #23 python 原生支持报错吗?之前看 Annotation 只是真的是 Annotation
    janxin
        29
    janxin  
       2019-10-08 16:50:10 +08:00
    没有吧,前端不是很多人还在用 JS 吗?

    另外关于 Type Hint,其实也可以跟 d.ts 一样挂外部描述文件 pyi 上去,也可以吧 stub file 单独发布成库,比如 Django 的 django-stub。

    具体方式参考:mypy.readthedocs.io/en/latest/stubs.html
    qcts33
        30
    qcts33  
       2019-10-08 17:04:23 +08:00
    @ayase252 vscode 是支持 type hints 提示的吧,我记得在函数的参数声明中加上 hint 之后 vscode 就能对相应的变量进行提示了
    Raymon111111
        31
    Raymon111111  
       2019-10-08 17:06:11 +08:00
    应该是 python 没啥大型项目吧?
    XIVN1987
        32
    XIVN1987  
       2019-10-08 17:06:34 +08:00
    @janxin
    我觉得还是把类型标注和代码写一起比较好,,不然其中一个更新了另一个没更新会导致不匹配,,更麻烦

    只不过以前 Python 没有标准的类型标注语法,,各个 IDE 和框架各自为战,,现在既然已经有标准标注语法了,大家都用这个标注语法就没问题了,,
    janxin
        33
    janxin  
       2019-10-08 17:07:19 +08:00
    @love 比 TS 肯定比不上的,TS 可以算是完全的新语言了,只是兼容 JS 的部分语法。
    表达力上还是比较欠缺的,3.8 版本也强化了部分能力
    jjx
        34
    jjx  
       2019-10-08 17:09:05 +08:00
    python 因为有 python 之禅 的约束

    代码的可读性是每个 python 入门后要求的第一位

    至于某些人总是用小工具, 不讲究 来描述 python , 那可能是没有 把 python 当成主要语言来对待的, 不能用来说明问题
    janxin
        35
    janxin  
       2019-10-08 17:09:48 +08:00
    @XIVN1987 自然都是支持的,不过 Type Hint 本身也在进步,逐渐加新的能力,另外有些库目前需要兼容 py2 程序或者低版本 3.5 及以下
    wangyzj
        36
    wangyzj  
       2019-10-08 17:15:42 +08:00
    咋说呢
    虽然我前后端都搞
    但我依然受不了前端码农那种拯救世界的心
    同时我也很钦佩前端码农那种世界必须由我来拯救的执着
    ayase252
        37
    ayase252  
       2019-10-08 17:16:23 +08:00
    @qcts33 对,但是一些库(或者说绝大部分)由于一些原因是没有的
    qcts33
        38
    qcts33  
       2019-10-08 17:19:59 +08:00
    @ayase252 哦哦,这个意思
    遇到这种我会在我自己的代码里加 hint,至少让自己能用上代码补全😁😁😁
    laike9m
        39
    laike9m  
       2019-10-08 17:21:32 +08:00 via Android
    @ChristopherWu 原生不支持
    leavic
        40
    leavic  
       2019-10-08 17:23:32 +08:00
    这玩意又没啥性能提升,写起来还增加工作量。
    你要说加个类型提示就能达到 C 的效率,我每行都写。
    ChristopherWu
        41
    ChristopherWu  
       2019-10-08 17:26:00 +08:00
    @laike9m #38 哈哈,我就是要吐槽这个- -
    ChristopherWu
        42
    ChristopherWu  
       2019-10-08 17:26:48 +08:00
    @leavic #39 静态语言的好处之一就是可以有类型检查。。PLT 的研究都是往类型系统上面研究。
    keelii
        43
    keelii  
       2019-10-08 18:09:39 +08:00
    TypeScript 是一门新的编程语言,是 JavaScript 的超集。Python 的 Type Hints 只是给 Python 加了一层类型系统。

    非要比也得是 Flow 和 Python 的 Type Hints 来对比。
    ImJoeHs
        44
    ImJoeHs  
       2019-10-08 18:09:45 +08:00
    @ChristopherWu #40 原不原生一点都不关键,annotation 才是坠吼滴,ts 最终执行还不是 js,构建 /commit hook/CI 任意一个阶段去警告就完了。
    至于为什么不流行,这不是必然的么,毕竟 py 是世界上最好的两门语言
    ChristopherWu
        45
    ChristopherWu  
       2019-10-08 18:13:20 +08:00
    @ImJoeHs #43 怎么是一个熟悉的 ID ?- = - 原生关键啊,自家孩子跟收养的,地位还是有区别。。
    ImJoeHs
        46
    ImJoeHs  
       2019-10-08 18:26:30 +08:00
    @ChristopherWu #44 所以关键的点在哪?=-=
    TS 从来也不是官方啊,ECMA TC39 也永远不可能给 js 加上类型,这本质上就是两个社区喜好的问题
    ImJoeHs
        47
    ImJoeHs  
       2019-10-08 18:31:36 +08:00
    @keelii #42 不,TS 团队早就决定再也不会自己加除了静态类型特性以外的其他语言特性,1.0 以前的糟糕决策(比如 decorator )已经带来了分裂,以后永远也只会跟随 TC39,根本称不上是“一门新的编程语言”。
    TS 跟 flow 没有本质区别
    ps1aniuge
        48
    ps1aniuge  
       2019-10-08 18:34:42 +08:00
    @abcbuzhiming 非常透彻。
    ChristopherWu
        49
    ChristopherWu  
       2019-10-08 18:49:18 +08:00
    @ImJoeHs #45 其实我的观点就是,py 跟 elixir 的 type annotation 都是语言官方加的;如果语言官方有像 elixir 那样默认检查类型不一致的问题( py 没有),使用的人数会多一些。。
    比如 elixir 的是”using type specifications is useful because“, https://hexdocs.pm/elixir/typespecs.html
    而 py 则是开头就来一句:The Python runtime does not enforce function and variable type annotations。https://docs.python.org/3/library/typing.html
    写个 type 标注,结果还要自己去下一个第三方库来检测。。不过也是我个人感觉,版本不一致也可能有吧,3.5 才支持的


    不过你说的也有道理。。可能前端就是对强类型有强需求?
    byaiu
        50
    byaiu  
       2019-10-08 18:53:43 +08:00 via Android
    Python 是动态语言,但 Python 是强类型的。每个 PyObject 都关联了一个 PyType,和 js 的原型链是完全不同的。
    abcbuzhiming
        51
    abcbuzhiming  
       2019-10-08 19:02:56 +08:00
    @ImJoeHs ts 有类型系统,怎么就不是一门新语言了? ts 决定紧跟标准就是为了让用户切换到 ts 的成本降到最低,这个策略没错,否则旁边可是有一票能编译成 WebAssembly 的虎视眈眈呢。
    ts 和 flow 就不是一个路子,否则 flow 怎么败了
    keelii
        52
    keelii  
       2019-10-08 19:03:51 +08:00
    @ImJoeHs 我说 TS 是一门新的编程语言的重点在于 TS 在编译器设计层面,语法层面的设计 TS 固然要紧随 TC39 的规范的,这是 TS 被设计的初衷。但这并不妨碍 TS 去添加一些新的自有的特性。TS 是一门完整的编程语言,只是稍带着可以编译成 ES5,6,Next 而已。只是它被设计成了让我们感觉不到与原生 JS 的差异罢了。

    Decorator 很早就在 TS 中被实现并不是因为 TS 团队做的决定不对,而是社区很需要这种东西,但是 TC39 进度太慢,不得已面为之的(某种程度上 TS 反推 TC39 ),再一个早期的 TS 必然是要添加很多新的特性来吸引开发者的关注的,现在语言基础成熟了当然不会再添加什么新的破坏性的特性。

    你要说 TS 跟 JS 没有本质区别,我兴许还能部分赞同,但你说 TS 跟 flow 没有本质区别那就真的是大错特错了。flow 只是个 type check 而已,它有接口、类、泛型、模块系统这些东西吗?更不要提 Control flow analytics 这种高级玩意儿了。
    ImJoeHs
        53
    ImJoeHs  
       2019-10-08 19:25:50 +08:00
    @keelii #51
    1. interface / generic flow 怎么没有? 2. 类跟模块系统是 js 的
    Decorator 的讨论有兴趣自己去搜,当前 ts 的实现已经与最新提案有差异了,这在未来都是坑。
    ts/flow 的类型检查有区别能说明什么?到今天 nominal type 还归在 Future 呢,然后呢?

    请仔细看看 ts 的设计目标 https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals#non-goals,这决定了它未来,它只会是 “JS that scales”
    ImJoeHs
        54
    ImJoeHs  
       2019-10-08 19:33:50 +08:00
    @abcbuzhiming #50 见楼上,不想讨论了。
    love
        55
    love  
       2019-10-08 19:53:23 +08:00
    @keelii 你真的用过 Flow ?某种程度上 Flow 比 TS 更强大,可惜很多设计不接地气,没能起来,早期版本 Bug 众多,报错天书。之前我用了一年 Flow,后来转 TS 了。
    szzhiyang
        56
    szzhiyang  
    OP
       2019-10-08 20:36:06 +08:00
    @ChristopherWu 可以用 mypy --strict 强制校验类型的,Python 之父也参与了 mypy 的开发。
    hadixlin
        57
    hadixlin  
       2019-10-08 21:30:45 +08:00
    python 是动态类型
    billlee
        58
    billlee  
       2019-10-08 23:54:07 +08:00
    想用静态类型的 python 程序员跑去用 java 了(逃
    vkhsyj
        59
    vkhsyj  
       2019-10-09 01:01:28 +08:00
    python web 不多
    Trim21
        60
    Trim21  
       2019-10-09 03:04:50 +08:00 via Android
    python 的类型标注虽然经常说是只用于类型检查阶段如何如何,但其实有些框架比如 fastapi 和 pydantic 已经把类型标注当成一个运行时的特性在用了。
    比如 fastapi 会根据对应路由 handler 的参数和参数类型把对应的值从 query 或者 header 里面取出,然后判断是否能转为对应类型然后传递给 handler,各种取 header 或者取 query 的工作都由框架根据函数参数的类型标注和默认值来自动搞定。
    neroxps
        61
    neroxps  
       2019-10-09 08:26:11 +08:00
    @ps1aniuge #10 感觉某些条目还是先入为主,楼主是先学习了 ps 然后再转 py,肯定会各种水土不服。

    首先 py 就已经不太算 shell 了把,用 shell 的特性来要求 py 有点过分~哈
    MonoLogueChi
        62
    MonoLogueChi  
       2019-10-09 08:35:42 +08:00 via Android
    因为 ts 有个好爸爸,生态能发展起来
    free9fw
        63
    free9fw  
       2019-10-09 09:16:36 +08:00
    dart2js
    Torpedo
        64
    Torpedo  
       2019-10-09 09:51:26 +08:00
    python 的 type this 可以强制吗?
    话说前端里,好多用 ts 的都是 anyscript
    miaoever
        65
    miaoever  
       2019-10-09 10:54:16 +08:00
    Google 的 pytype, Facebook 的 pyre 以及 Dropbox 的 mypy 都在各自内部广泛应用。说白了各个 Python 大厂都意识到类型检查只有好处没有坏处(可以理解成成本最低的单元测试), 只是很多公司的工具链 /基础设施跟不上,做不了在 IDE 级别实时的类型推断 /检查,以及和 CI 流程整合的全局静态分析罢了。
    szzhiyang
        66
    szzhiyang  
    OP
       2019-10-09 12:43:57 +08:00
    @Torpedo 可以用 mypy --strict 强制校验类型的。
    SingeeKing
        67
    SingeeKing  
       2019-10-09 13:01:49 +08:00
    或许出个 Typhon 也能火……


    毕竟 JS->TS 相当于换语言,而 Python 目前最多不过是类型检查工具
    Torpedo
        68
    Torpedo  
       2019-10-09 13:34:27 +08:00
    @szzhiyang 那我觉得是 python 这种,你用了这个功能,并不能显得你高级。但是很多前端觉得用了 ts 显得高级 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5456 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 96ms · UTC 08:21 · PVG 16:21 · LAX 00:21 · JFK 03:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.