Typescript 如此成功,为何没有发展出所谓 “Typthon”?

2025 年 3 月 21 日
 JYLu
作为编程新手,我爱 Python 。我认为这是一个简洁好用的语言,生态丰富,官方文档细致,社区活跃。我本人目前在读研,是做应用数学里面算法方向的,做算法实验的时候,Python 简洁的语法和高质量的数值计算库使得实验编码的效率大大提高。

然而 Python 的类型有点过于灵活,这使得我在写程序的时候不时感到担忧,比如担心传参的时候传入非法的数据然而 IDE 却不能提醒我。类似地,这种强大的灵活性有时也使得调试 Python 程序变得很困难。比方讲假如你的程序里有不止一处语法错误,这些语法错误可能只能在运行时才能被发现。而且似乎运行一次只能找出一处错误,你需要不断地运行才能查找到所有的语法错误。

鉴于 Javascript-> Typescript 的大获成功,为什么没有发展出所谓的 “Typthon” ?既有 Python 简易的语法,又有很好地的 Python 的互操作性从而可以轻松地继承 Python 丰富的生态和活跃的社区,借助编译器使得调试维护程序更加轻松,岂不美哉?

既然 Microsoft 肯开发 Typescript , 何不也考虑一下“Typthon”呢?感觉会是大庇天下程序员俱欢颜的大好事啊。
10671 次点击
所在节点    程序员
85 条回复
biochen
2025 年 3 月 22 日
我的主要写 Python ,也以 Python 的方式写过 C++。因为用 Django 做网站,也写一点 JavaScript 代码。

Python 和 C++非常优雅,JavaScript 则是一言难尽。

举例:a = 1, b = "2", a + b = ?
Python 会报类型错误,TypeError: unsupported operand type(s) for +: 'int' and 'str'。
JavaScript 的答案是"12"。

Python 是动态类型,但是强类型,不会隐式转换类型。C++是静态类型,数字 a ,其实也可以转换为字符 b ,不能重用变量名 a 而已; Python 的动态类型,更加方便,可以看成语法糖。C++的变量都有显式的定义,阅读 C++代码,可以清楚地知道每一步的输入和输出是什么。Python 的变量可以是隐式定义,根据变量值,Python 选一个合适的变量类型; Python 的变量类型还能改变。读 Python 代码时,不借助代码阅读工具提示变量类型,非常地吃力。所以,type hints 出现了,可以像 C++那样显性标注类型,方便人类阅读。

JavaScript 也是动态类型,但是是弱类型,1 + "2"会隐式转换得到"12"这个结果。你其实是忘记将"2"转换成 2 了,你本来期待的结果是 3 ,结果 JavaScript 得到了一个错误的答案“12”,而没有报错。

JavaScript 粉可能会觉得,你看我 JavaScript 多么灵活啊,但是这种“灵活”会让程序员有额外的心智负担,需要熟悉这种“灵活”。

JavaScript 推出时非常匆忙,里面的“灵活”或者“坑”太多了,JavaScript 自己还有严格模式。奈何历史负担太大,不能废掉 JavaScript 。所以有 TypeScript 这种严格的 JavaScript ,方便程序员编码和维护,然后翻译成 JavaScript 交给浏览器执行。

Python 一直很严谨,经历 Python2 到 Python3 的升级后,很多不 Python 的特性也修复了,目前社区没有出 Python4 的想法。
xgdgsc
2025 年 3 月 22 日
还可以试试 https://mp.weixin.qq.com/s/6JCJTnuGQbYqMv4N3Ylj3Q 这个编译类型稳定 julia 代码到 cpp 的国产替代 MATLAB 软件
duzhuo
2025 年 3 月 22 日
PEP 561 、PEP 484
写出屎山我觉得很多都是故意的
matrix1010
2025 年 3 月 22 日
"作为编程新手,我爱 Python", 我刚当程序员时也是这样想,但用多了 Go 之后越来越嫌弃 Python
w568w
2025 年 3 月 22 日
同楼上,你把类型检查器开到 strict ,写起来和静态语言差不多。

Python 是典型的渐进类型( Gradual Typing )语言。也就是说,你可以标注类型以享受类型检查的好处,也可以不标注类型来快速编码。类似的还有 Dart 的 dynamic 、TypeScript 的 any (如果没禁用的话)、PHP 等。

Python 现在的问题是泛型类型支持太差,很多时候不得不采取一些非常尴尬的写法来标注类型。
simple2025
2025 年 3 月 22 日
@w568w 有基本的类型差不多了,不然像 ts 那种类型体操,何必呢..
AV1
2025 年 3 月 22 日
@biochen
python 不也是可以 True + 2 ,结果为 3 且不报错嘛。
biochen
2025 年 3 月 22 日
@DOLLOR #27
原因是 True == 1 ,False == 0
很多语言都可以这么处理 True 和 False ,这个应该算不是 bug ,可以算是 feature 。
noahliaszn
2025 年 3 月 22 日
js 确实很抽象 至少比 python 抽象多了 ...

[1, 2, 3] + [4, 5, 6]; // -> '1,2,34,5,6'
AV1
2025 年 3 月 22 日
@biochen
但很多语言是不允许 int 和 bool 未经转换直接参与数学运算的。
像 go 、java 、dart 、swift 都不允许,连 ruby 这种跟 python 同样号称动态+强类型,都不允许。
所以当年 python 2 -> 3 没趁机把这漏网之鱼补上是个失误,后面再说什么理由都只是找补。
leonshaw
2025 年 3 月 22 日
前端历史原因只能在 JS 上雕花
PopRain
2025 年 3 月 22 日
python 本来就是做为胶水语言、为非专业开发人员发明的;用来专业开发软件系统是本末倒置
UnluckyNinja
2025 年 3 月 22 日
python3.5 支持 typing 提示,后端语言确实选择很多,不喜欢 python 的直接就换其他语言了,比如微软直接就 c#了,不像前端只能在 js 上做文章,同时浏览器是微软第一个失去的高地,从另一个方面弥补回来也很正常。虽然很多时候说 xxx 不做总会有别人来做,但更普遍的是 xxx 没做所以现在处于没得用的状态,现在很可能就是后者,推行相关生态的人还没出现
rb6221
2025 年 3 月 22 日
前几年还有很多人在说“人生苦短,我用 Python” 你看这两年还有人提吗?
说白了这语言根本就没有所谓的真的那么让人喜爱,随着你接触到的工程越复杂越是这样。用他只是迫不得已。就这样。
dragondove
2025 年 3 月 22 日
@JYLu 和 Typescript 那样的差距很大是指什么?如果说是类型运算方面的,那确实没有,但是仅仅是类型提示、静态检查错误检测,python 已经完全具备了。你只要使用带静态检查的语言服务器开严格模式就可以了。复杂代码也是一样的,python 和 typescript 一样支持字面量类型,union 类型而且还是自带 tag 的 union 类型,这方面反而比 typescript 要好用点。
jqtmviyu
2025 年 3 月 22 日
说真的, 我不太喜欢这门需要游标卡尺的语言. 特别是它的定义类型部分.

我喜欢要么彻底放飞自我, 要么严格执行.

偏偏可以在代码里有的地方限制, 有的不限制, 传参时 字符串 列表 字典 一通乱传也不报错, 等到运行时就开始报错了.
Lockroach
2025 年 3 月 22 日
每一个语言都有其优势区间和使命,对 py 来说动态类型推导和 type hint 够用了。ts 是因为 js 原生就不支持 type hint ,ts 到 js 还要一层编译。你觉得不够用可以自己 fork 一个 python 实现强制类型标注和增加泛型 feature
june4
2025 年 3 月 22 日
@biochen 你不喜欢 js 只是因为你写得少而已。我本来也是 python 写了几年,很讨厌 js 。后来转 js 全栈后 js 语法真香,比 py 舒服。你说的类型问题在 ts 里不存在。
dayeye2006199
2025 年 3 月 22 日
我自己写的时候:写 python 还要写 typehint ,不如回家卖红薯
我看别人写的时候:写 python 竟然不写 typehint ,哪个杀千刀的!
kneo
2025 年 3 月 22 日
python 的 typehints 和 typescript 本质是一样的。
虽然就目前的表达能力来讲比 typescript 差很多,但是官方的原生支持在很大程度上消灭了竞争者,与其创建个新的转译层,不如继续改进已有的 typhints 。

> 还有编译器对于调试和维护相对复杂的代码也是很有帮助的

只能说不知所云。TypeScript 便于维护代码的原因就是类型标注和静态类型检查。难道还有别的???

> 觉得编译成 Python 不太划算,那么有没有可能编译成比 Python 更低级更快的机器码什么之类的?

所有语言都是编译成比 Python 更低级的代码。

> 以及为什么 JavaScript 能一统前端江湖,后端却没有,感觉前端的花样反而比后端多呀。

因为 JavaScript 是浏览器的原生语言。这个原生语言比后端的原生语言(机器码)要高级。凑合能用+原生支持在很大程度上消灭了竞争者。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/1120232

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX