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

为什么没有类似 TypeScript 这样的 TypePython 语言( Python 超集)呢?

  •  1
     
  •   miniyao · 2020-11-17 11:36:19 +08:00 · 7258 次点击
    这是一个创建于 1494 天前的主题,其中的信息可能已经有所发展或是发生改变。
    人多发现用 TypeScript 确实规范了很多,增加的成本是可以接受的。

    好像没有发现 Python 有类似的超集语言 TypePython 这样的呢?
    44 条回复    2020-11-18 15:01:37 +08:00
    mxT52CRuqR6o5
        1
    mxT52CRuqR6o5  
       2020-11-17 11:37:06 +08:00
    python3
    cmdOptionKana
        2
    cmdOptionKana  
       2020-11-17 11:42:30 +08:00
    ciaoly
        3
    ciaoly  
       2020-11-17 11:44:30 +08:00 via Android   ❤️ 4
    Python 创始人不是去微软了?你要的 type Python 大概在路上了
    tabris17
        4
    tabris17  
       2020-11-17 11:45:11 +08:00
    cython

    stackless python
    cmdOptionKana
        5
    cmdOptionKana  
       2020-11-17 11:51:49 +08:00   ❤️ 9
    其实像 python, ruby 这样的动态语言,从理念上说是比静态语言更先进的,曾经也凭效率和优雅火过一把,当时还有句名言 “编程语言发展的终极形态就是 Lisp”,当时认为电脑性能提升了,动态语言运行效率问题变得不重要,反而写程序写得快更重要,然而……

    没想到的是,IDEA 、Atom 、vscode 等现代化 IDE/编辑器的发展,让静态语言写起来也很快,静态分析功能也强大,反而动态语言傻了眼,风水轮流转,静态语言又全面制霸了。
    wlnirvana
        6
    wlnirvana  
       2020-11-17 12:00:36 +08:00   ❤️ 1
    从另一个侧面来看,也是因为 Web 技术过去十几年实在是太火了,发展远远超过 Python,所以大公司愿意在相关的工具链上投入大量资源和精力,才有了 TypeScript 这种东西。
    seki
        7
    seki  
       2020-11-17 12:09:52 +08:00   ❤️ 1
    因为 python 本身就设计有 typing
    https://docs.python.org/3/library/typing.html
    xiaolinjia
        8
    xiaolinjia  
       2020-11-17 13:45:08 +08:00
    python3 有 type hints,只是因为不兼容 py2,被一些人狂吐槽罢了。实际上 py3.6+ 的很多第三方库,都已经加上 type hints 了。https://www.v2ex.com/t/669912#reply46
    MinQ
        9
    MinQ  
       2020-11-17 14:12:10 +08:00   ❤️ 2
    IronPyton 坟头草都快 2 米高了
    vincenttone
        10
    vincenttone  
       2020-11-17 14:15:56 +08:00
    如果你只是为了规范,python 完全可以规范了,还要个超集做规范是要干什么。。。毕竟 python 不是 js
    no1xsyzy
        11
    no1xsyzy  
       2020-11-17 15:14:25 +08:00
    Python 还有不少库实用上了 __annotations__
    比如 dacite 和 pydantic
    似乎站里有人自称做过一个把函数根据 __annotations__ 自动生成图形界面的
    owtotwo
        12
    owtotwo  
       2020-11-17 15:22:52 +08:00 via Android
    平时 Python 代码过百行基本都写满 type-hints 的
    pyright 挺好用的 不喜欢也可以换 mypy 或者其他
    laike9m
        13
    laike9m  
       2020-11-17 15:28:30 +08:00   ❤️ 1
    TypeScript 和 Python 用户路过。从使用体验来讲,type hints 远远好于 TypeScript,主要在于 TypeScript 的许多生态和 JavaScript 割裂严重,尤其是工具链。如果说 Js 今天就从世界上消失那其实问题不大,但我总有种 TypeScript 和 JavaScript 往后会变成 Python 2/3 之争的感觉。
    Mark24
        14
    Mark24  
       2020-11-17 15:45:04 +08:00
    @cmdOptionKana 还是人工工资太便宜,有个成本导向。
    ruanimal
        15
    ruanimal  
       2020-11-17 15:49:13 +08:00
    @xiaolinjia python2 坟头草也 1 米高了
    wellsc
        16
    wellsc  
       2020-11-17 16:07:17 +08:00
    Cython?
    est
        17
    est  
       2020-11-17 16:24:07 +08:00   ❤️ 5
    你们想要的不是 type,你们想要的是 IDE 里 . 一下自动弹提示和属性方法写错了的自动检查。
    Macv1994
        18
    Macv1994  
       2020-11-17 16:41:09 +08:00
    @ruanimal 一米高应该还差 1 个月 13 天 哈哈哈
    crella
        19
    crella  
       2020-11-17 16:49:40 +08:00
    @cmdOptionKana Visual Studio 2010 的功能已经比较强大了吧,我恨我自己作为外行人士,竟然太晚学习 C#,明明一开始就是从 VB6 转 VB.NET 的。
    szzhiyang
        20
    szzhiyang  
       2020-11-17 17:51:34 +08:00
    @est 没有 type 就没有后者。
    jatai
        21
    jatai  
       2020-11-17 18:10:51 +08:00 via Android
    随着廖雪峰入职微软, 这个很快就会有了, 不过应该不影响 游标卡尺 热卖现状
    nthhdy
        22
    nthhdy  
       2020-11-17 18:56:41 +08:00
    有 mypy 啊,正是你想要的
    lewinlan
        23
    lewinlan  
       2020-11-17 19:06:40 +08:00 via Android
    为什么会有 ts ? 因为你不能决定客户端用什么,所以必须兼容 js 。
    那么问题来了,为什么在你可以主宰一切的后端,还要委屈自己强行给 python 加类型?
    直接静态类型语言吧
    人生苦短,少点动态
    l1nyanm1ng
        24
    l1nyanm1ng  
       2020-11-17 19:09:44 +08:00
    @jatai 过分了啊,你甚至不肯称呼廖雪峰大神一声教父(狗头保命
    xfcy
        25
    xfcy  
       2020-11-17 19:26:59 +08:00
    Tython 好像听起来也不错
    Roxk
        26
    Roxk  
       2020-11-17 19:32:14 +08:00 via iPhone
    @xfcy 中文名:泰森🙊
    est
        27
    est  
       2020-11-17 19:39:29 +08:00
    @cmdOptionKana 静态语言的最终归属就是一大堆 XML 来实现动态特性。

    哦不对,YAML 。。。
    AX5N
        28
    AX5N  
       2020-11-17 19:57:53 +08:00   ❤️ 1
    python 这个所谓的 typing 丑到掉渣,与其让我这样写,我直接换静态语言算了。
    secondwtq
        29
    secondwtq  
       2020-11-17 20:54:54 +08:00
    #23 是正解,JS 这语言和政府一样,有天然的垄断性,所以其实很多时候是作为目标语言。但是 JS 从设计之初(如果这破玩意真的有“设计”的话)又是作为编程语言来设计的,所以 JS 有直接的编程语言和间接的目标语言两面(有意思的是,JS 无论作为编程语言,还是作为目标语言,都挺烂的 ...)。
    前端圈开始是把 JS 作为编程语言来用,后来发掘出了目标语言的潜力,这才有了各种 source-to-source transformer,后来又有了各路 Script 。TypeScript 作为各路 Script 中的一个实例,虽然以兼容 JS 为核心设计理念,在作为“JS 的‘超集’的同时”依然可以理解为“以 JS 为目标语言的船新的编程语言”(忒修斯:阿嚏!)

    如果把目标定在 JS 上的话,那 Babel 则是一个静态的 Rosetta,Reason 相当于 ocamlopt,TypeScript 类似 C 语言。在 naive 领域,目标语言是具体 ISA 的机器码,CPython 实际上是“用 C 实现的一个脚本语言解释器”,从目标语言的角度来看已经可以和 TypeScript 有一定的可比性,所以说 CPython 汁己就已经是 TypeScript 了,同时还有对等的 Ruby 、Perl 和一些无 JIT 的 Scheme 实现等。( CPython 放在 JS 上应该是“用 JS 实现的一个脚本语言解释器”——因为 JS 作为目标实在是太慢了,所以除了练手项目之外很少见,可以说前端在应用层“AOT 编译"占绝对主导)

    和 JS 有类似情况的语言其实不少,C 是最接近的之一,有很多 C 的”超集“,以及一些和 C 完全不同的编程语言是编译到 C 的,同时 C 也广泛作为通用编程语言使用。还有 JVM Bytecode/MSIL/LLVM IR 等,不过这些语言本身设计就是目标语言 /中间语言,并不能作为编程语言。
    Death
        30
    Death  
       2020-11-17 21:18:17 +08:00
    @laike9m
    可惜 Reason 没有流行起来,就个人的体验而言,Reason 的 type system 感觉比 TypeScript 好多了。
    namelosw
        31
    namelosw  
       2020-11-17 22:42:10 +08:00
    @laike9m Compatible 的, 怎么可能割裂
    namelosw
        32
    namelosw  
       2020-11-17 22:43:31 +08:00
    @Death Hindley-Milner 从七十年代就已经成型了, 主要还是人们不思进取, 看见跟 C 不像的语言就敬而远之
    namelosw
        33
    namelosw  
       2020-11-17 22:48:10 +08:00
    @cmdOptionKana 这两个不矛盾, 最终还可以有静态类型的 LISP, 已经有很多了, 其实 TypeScript 抄的就是 Typed Racket. 然后还有比如 Lux Lang 这种 ML module + Haskell type system + LISP syntax 的新语言.

    长远来讲肯定是静态语言更强, 前提是表现力足够强, 允许人们表达绝大多数能想到的程序. 像 Java C#这种抠脚的类型系统很多代码写不出来. 像 Haskell 都有很多程序写不出来, TypeScript 很多时候也不得不用 as any.

    最终方向就是 Lambda Cube 全满, 像 Idris 那种 Dependent Type 语言, 不过问题是想写好 IDE 还要等几十年.
    dustinth
        34
    dustinth  
       2020-11-17 22:48:58 +08:00
    TypeScript 和 JS 是相辅相成的: JS 的广泛应用给 TypeScript 提供了用户基础, 也是 TypeScript 的在设计上定义为 JS 的超级以及采用类型抹除方案的原因; 反过来, JS 的动态特性以及 JS 的没有静态 Type System 的包袱也为 TypeScript 在 Pratical 的 Type System 上玩到极致提供了基础.
    oahebky
        35
    oahebky  
       2020-11-17 23:30:16 +08:00
    其实你要的“编译”功能,不是“类型声明”。

    然后这个“编译”其实就是 “一键报‘低级’错误” !


    其实其它编译型语言,写到“抽象”级别,类型声明一样没有啥帮助,错的跑起来 bug 的地方一样错,一样崩溃;一样在写代码的时候发现不了。


    ======

    当然,有编程语言本身带“编译报错”功能和不带编译报错功能是有区别的。
    learningman
        36
    learningman  
       2020-11-18 00:12:14 +08:00 via Android
    @xiaolinjia 我学 Python 的时候,这玩意儿就已经是标准了
    SingeeKing
        37
    SingeeKing  
       2020-11-18 00:24:28 +08:00 via iPhone
    其实楼主要的就是 Pydantic 吧,参数类型不对直接报错,typing hint 最多算是强大一点的注释,运行时并不起作用

    另外,CPython 是 Python 的 C 实现,Cython 才是一种基于 C+Python 多东东,上面说的很多这个人概念是模糊的
    laike9m
        38
    laike9m  
       2020-11-18 08:31:29 +08:00 via Android
    @namelosw 举几个例子。
    - js 里的 map 类型,ts 里就没有,因为 map 是后来加的。最接近的只能用 record,但也有一些问题
    https://stackoverflow.com/a/30019750
    - protobuf + grpc 的代码生成。grpc-js 至今无法依赖官方工具生成 ts binding,只能依靠第三方库
    - 各种各样的库都没有 ts 版本,或者有了也没有很好的支持

    这些问题我相信只要你写了一定量的代码都会遇到,并且在一个社区要支持两种语言的情况下是必然出现的。
    laike9m
        39
    laike9m  
       2020-11-18 08:36:23 +08:00 via Android
    @SingeeKing 用静态语言不就是想在编译期检查出错误么,而不是放在运行时才报错么
    myCupOfTea
        40
    myCupOfTea  
       2020-11-18 08:50:19 +08:00
    typing hint 简单用用还行,其实还是有点鸡肋
    mepwang
        41
    mepwang  
       2020-11-18 09:07:41 +08:00 via iPhone
    自己从头做一个新的编程语言,或者从现有 python 分支一个出来
    看不爽就自己搞出个新的来打倒它,这才是来源精神
    namelosw
        42
    namelosw  
       2020-11-18 10:31:11 +08:00 via iPad
    @laike9m 这些都是 checker 的事情啊,并不妨碍你用,可以 any,可以 allowJs. TS 不像其他的静态类型语言 check 不过就不能运行.
    halo117
        43
    halo117  
       2020-11-18 10:41:30 +08:00 via iPhone
    @namelosw 主要是这些概念超前的类型理论只要有好处一定会被现有 PL 至少在未来某天吸收并在某种特性延展开来,而不得过往一开始就标榜类型系统强大的语言身上得到繁华。 性能,代码复杂度维护,抽象表达能力三者从项目角度是不可能同时满足优势的三角,只能取其两两。现代软件工程里面只关注前两者居多,后者过于复杂是应该非常警惕,而且不可取
    namelosw
        44
    namelosw  
       2020-11-18 15:01:37 +08:00   ❤️ 1
    @halo117 很多人都会下这种结论, 我倒觉得可疑... 比如 map filter 复杂吗? 其实用几天就会发现一点也不复杂. 我很久以前看到 90 年代的老帖子, 很多人觉得让大部分程序员理解 map filter 是不可能的事情. 60 年代 Turner 就已经就已经搞清楚了, SICP 里面也清楚地写着, 结果 2013 年左右才真正进入主流视野. 不仅 map filter, 只要用一用, 连 Promise 这种概念主流程序员都能理解了.

    Hindley-Milner 的类型系统比 TypeScript 和 Scala 容易理解得多, 人们不用只不过是因为它们长在技能树上的不同分支上罢了. 我只能理解成归根结底是人们思想闭塞, 不愿意接受不同的思想.

    我觉得 Paul Graham 的“Blub 语言”很好地解释了这个现象: 为了不伤害某些人的感情, 假设“Blub 语言”即某个平庸的主流语言. 当“Blub 程序员”往鄙视链下面看的时候, 就会觉得“连 X 功能都没有, 简直是辣鸡”. 当“Blub 程序员”往鄙视链上面看的时候, 因为他不能理解这些设计, 因为他只会以 Blub 的形式来思考, 只会觉得“这些功能很奇怪”或者“都是 Blub 功能的语法糖而已”.

    因为工业界充满了“Blub 程序员”, 所以有价值的 feature 都要等半个世纪才会 adopt. 很多“Blub 程序员”每天还会抱怨自己做了一段时间的项目都是屎山, 却不能意识到他们的工具早已 underkill 了.

    Blub 语言出处: http://www.paulgraham.com/avg.html
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1914 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 00:02 · PVG 08:02 · LAX 16:02 · JFK 19:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.