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

2019-10-08 12:45:22 +08:00
 szzhiyang
6985 次点击
所在节点    程序员
68 条回复
ChristopherWu
2019-10-08 17:26:00 +08:00
@laike9m #38 哈哈,我就是要吐槽这个- -
ChristopherWu
2019-10-08 17:26:48 +08:00
@leavic #39 静态语言的好处之一就是可以有类型检查。。PLT 的研究都是往类型系统上面研究。
keelii
2019-10-08 18:09:39 +08:00
TypeScript 是一门新的编程语言,是 JavaScript 的超集。Python 的 Type Hints 只是给 Python 加了一层类型系统。

非要比也得是 Flow 和 Python 的 Type Hints 来对比。
ImJoeHs
2019-10-08 18:09:45 +08:00
@ChristopherWu #40 原不原生一点都不关键,annotation 才是坠吼滴,ts 最终执行还不是 js,构建 /commit hook/CI 任意一个阶段去警告就完了。
至于为什么不流行,这不是必然的么,毕竟 py 是世界上最好的两门语言
ChristopherWu
2019-10-08 18:13:20 +08:00
@ImJoeHs #43 怎么是一个熟悉的 ID ?- = - 原生关键啊,自家孩子跟收养的,地位还是有区别。。
ImJoeHs
2019-10-08 18:26:30 +08:00
@ChristopherWu #44 所以关键的点在哪?=-=
TS 从来也不是官方啊,ECMA TC39 也永远不可能给 js 加上类型,这本质上就是两个社区喜好的问题
ImJoeHs
2019-10-08 18:31:36 +08:00
@keelii #42 不,TS 团队早就决定再也不会自己加除了静态类型特性以外的其他语言特性,1.0 以前的糟糕决策(比如 decorator )已经带来了分裂,以后永远也只会跟随 TC39,根本称不上是“一门新的编程语言”。
TS 跟 flow 没有本质区别
ps1aniuge
2019-10-08 18:34:42 +08:00
@abcbuzhiming 非常透彻。
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
2019-10-08 18:53:43 +08:00
Python 是动态语言,但 Python 是强类型的。每个 PyObject 都关联了一个 PyType,和 js 的原型链是完全不同的。
abcbuzhiming
2019-10-08 19:02:56 +08:00
@ImJoeHs ts 有类型系统,怎么就不是一门新语言了? ts 决定紧跟标准就是为了让用户切换到 ts 的成本降到最低,这个策略没错,否则旁边可是有一票能编译成 WebAssembly 的虎视眈眈呢。
ts 和 flow 就不是一个路子,否则 flow 怎么败了
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
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
2019-10-08 19:33:50 +08:00
@abcbuzhiming #50 见楼上,不想讨论了。
love
2019-10-08 19:53:23 +08:00
@keelii 你真的用过 Flow ?某种程度上 Flow 比 TS 更强大,可惜很多设计不接地气,没能起来,早期版本 Bug 众多,报错天书。之前我用了一年 Flow,后来转 TS 了。
szzhiyang
2019-10-08 20:36:06 +08:00
@ChristopherWu 可以用 mypy --strict 强制校验类型的,Python 之父也参与了 mypy 的开发。
hadixlin
2019-10-08 21:30:45 +08:00
python 是动态类型
billlee
2019-10-08 23:54:07 +08:00
想用静态类型的 python 程序员跑去用 java 了(逃
vkhsyj
2019-10-09 01:01:28 +08:00
python web 不多
Trim21
2019-10-09 03:04:50 +08:00
python 的类型标注虽然经常说是只用于类型检查阶段如何如何,但其实有些框架比如 fastapi 和 pydantic 已经把类型标注当成一个运行时的特性在用了。
比如 fastapi 会根据对应路由 handler 的参数和参数类型把对应的值从 query 或者 header 里面取出,然后判断是否能转为对应类型然后传递给 handler,各种取 header 或者取 query 的工作都由框架根据函数参数的类型标注和默认值来自动搞定。

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

https://www.v2ex.com/t/606977

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

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

© 2021 V2EX