
知乎上有个几年前的问题,那时候不用 type hint 的原因主要有以下几点:
2020 年的今天,上述的有些问题应该已经没了,剩下的问题是不是依然阻碍使用 type hint 呢?
1 Vegetable 2020-05-09 11:10:41 +08:00 用了,IDE 支持已经不错了,所以其他缺点都不算缺点了。 最近在学习 Fastapi 和 pydantic,很惊艳。 冷暖自知吧,我个人感觉很好。 |
2 xiaolinjia 2020-05-09 11:23:47 +08:00 用了,挺好的。 |
3 LokiSharp 2020-05-09 11:29:30 +08:00 不用,这个特性目前依旧是个高级的注释,运行时没有啥实际作用,我写 Python 就是为了少敲点类型,真需要静态类型的干嘛不换个语言br />更好的 IDE 支持?我写 Python 很多时候就是因为写脚本用编辑器直接敲起来方便,项目复杂度真到到非用 IDE 不可的时候,用 Java C# 之类的工程化的语言不是更香么 |
4 xiaolinjia 2020-05-09 11:44:28 +08:00 我感觉看场景,ls 说的只适用于单人开发场景,或者说把场景固定死了在单人小应用(脚本就是其中一种)中使用 py 。我觉得 type hint 在多人协作中就很有用,因为动态类型看着累,并且代码还不都是自己写的。直接配合 ide 提醒就很舒服。不支持 py2 是真的,不过 2 都退休了就算了(虽然我公司的一些项目还在 2,我巴不得 2 也能上)。 |
5 looplj 2020-05-09 11:48:08 +08:00 大型项目可以用 我一般用 Go 和 Java,用 Python 就是为了不写类型的,就不用了。 |
6 xpresslink 2020-05-09 12:04:59 +08:00 python 比较适合做大量尝试性的开发项目,还有就是一次性的任务,比如爬虫。还有开发工具类的项目,比如运维工具系统的 web 界面之类,还有一些系统和管理后台等。这类项目基本上就是自己一个人玩的项目,写不写注释无所谓。 |
7 LokiSharp 2020-05-09 12:05:33 +08:00 @xiaolinjia #4 然而多人场景用真静态类型的语言你会更舒服,性能还比 Python 好一个数量级 |
8 dayeye2006199 2020-05-09 12:12:59 +08:00 可以上 pyre 和 mypy,自动加上类型注释和做类型检查。 个人脚本可以不加。但多人协作加上这个会对大家心智负担减轻很多。 Instagram 内部是强制 pyre 检查的,不过不让 commit 的。 |
9 di94sh 2020-05-09 12:15:54 +08:00 via iPhone 当你一直要处理复杂数据结构的时候,你就是到 type hint 多香了。dict 传来传去到最后自己都不知道里面是啥 |
说实话,写这玩意很累 |
11 Liyiw 2020-05-09 12:25:26 +08:00 我感觉你说的前 4 点不会因为是 2020 的今天就没了吧 这些问题不是一直存在的吗 莫非 python 把 type hinting 的语法改了? |
12 so1n 2020-05-09 12:31:04 +08:00 via Android 用了,除了工程化外解析程序和 api 接口类型检验时也很好用 |
13 jjx 2020-05-09 12:53:51 +08:00 还停留在 python 2 |
14 Mohanson 2020-05-09 13:01:06 +08:00 python 许多标准库都加上 hint 了, 有什么理由不用呢... |
15 009694 2020-05-09 13:25:41 +08:00 用 而且用的很多。 就我平常用的最多的 matplotlib 来说 pycahrm 对 axes 的提示几乎没有 都靠记忆太累了,加上 type hint 之后 所有提示都有了,整体心智负担指数级下降 |
17 pakro888 2020-05-09 13:53:19 +08:00 好用,尤其是过一段时间再看项目,很有帮助 |
19 paoqi2048 2020-05-09 14:03:25 +08:00 准备试试 |
20 yhxx 2020-05-09 14:04:05 +08:00 有种在说 typescript 的感觉 其实我也一直觉得要是想要静态类型我换个语言就是了,用 python 就是不想写类型啊 |
21 niubee1 2020-05-09 14:06:31 +08:00 有个很扯的问题,我要返回类本身的时候,会报错,那么就是说我不能定义链式调用咯,太扯了 |
22 TransAM 2020-05-09 14:08:20 +08:00 via Android 类型标注只支持类,不支持协议。比如 list 协议和 list 类是不一样的,标成 list 类就会频繁崩溃。 |
23 cominghome 2020-05-09 14:20:01 +08:00 试用过一段时间,感觉就是个高级注释,对我来说没啥用。。。 |
27 rockyou12 2020-05-09 16:05:30 +08:00 对我这样的 java 写了好多年,才开始学 python 的很有用。特别是看课程给的代码,我都要自己给加上类型再写一遍,不然真的记不住有些什么 api…… |
28 Drahcir 2020-05-09 16:52:45 +08:00 准备开始规范化使用类型标注。 是一个代码风格的问题,开始会觉得挺麻烦,但熟悉以后对代码质量有很大帮助。 当然还有规范化注释也很重要。 |
29 wzw 2020-05-09 17:52:55 +08:00 via iPhone 我直接转 go 了 |
31 scorn 2020-05-09 17:54:53 +08:00 我都用 python 还写个什么静态类型 |
32 fox0001 2020-05-09 17:56:43 +08:00 via Android 我拥抱 go[狗头] |
33 lights 2020-05-09 18:08:22 +08:00 弱类型一时爽,重构火葬场 |
34 superrichman 2020-05-09 18:12:13 +08:00 via iPhone 没有,不如一句注释来的直观。 都用 python 了,不想搞静态语言那套东西 |
35 zhustec 2020-05-09 18:13:00 +08:00 一直没搞懂指向自身类型该怎么写 ```python class Node: value: int prev: ?? next: ?? ``` |
36 labulaka521 2020-05-09 18:34:51 +08:00 via Android 拥抱不了转 go 了 |
37 BaseVariable 2020-05-09 18:43:23 +08:00 @dayeye2006199 老哥,好像 pyre 和 mypy 是做类型检查的吧,哪个可以自动加类型注释呢? |
38 no1xsyzy 2020-05-09 18:51:33 +08:00 dataclass + dacite 写舒服了 其他地方不用,但碰到 JSON API 要解析只用注解来解析。 |
39 no1xsyzy 2020-05-09 18:52:46 +08:00 @zhustec #35 class Node: value: int prev: 'Node' next: 'Node' 确实很诡异,注解里写上字符串是 Forward Reference 要字符串本身的话需要 Literal['Node'] 这样(>=3.8 ) |
41 no1xsyzy 2020-05-09 19:01:40 +08:00 @zhustec #40 不能同意更多,写着写着突然说未定义,意识到需要加引号,也是心智负担。 所以我拿注解只用来解析 JSON API,写完 dataclass 以后 dacite.from_dict(SomeDataClass, some_dict) 就能把它变成一个 dataclass,支持 List Optional Union 等一众 typing 辅助项。 |
42 reedthink 2020-05-09 19:11:23 +08:00 方向错了 |
43 hspeed18 2020-05-09 19:16:45 +08:00 要 type hint 为什么不直接用静态语言 |
44 levelworm 2020-05-10 04:05:30 +08:00 via Android 一直在用,主要是给自己看,不然过一阵子未必回忆的起来。 |
45 skinny 2020-05-10 08:13:36 +08:00 有的代码用,觉得非常非常丑 + 麻烦,而且很多功能 docstring 也可以解决,更精简。至于 IDE 支持,我就遇到过连 PyCharm 都根本不识别的情况(比如 ThreadPoolExecutor ),现在好像已经修复了。 有的类型你一写容易变得非常长,加上名字还不能短,名字短有的你会忘记到底是干什么的,跟没有一样,也不是非常复杂的数据结构,就字典这种,虽然你可以单独在一行构建类型,后面使用,但是一层层套下来也是不够直观的,而且很多时候一个参数一行都很长,类型就占了大半,还多半用处不大,而且你用 PyCharm 看还是得各种跳转。即便你写了类型,很多时候依然要做运行时检查,比如类似于 reuquests.get 的 params 这种参数。 写着写着你会觉得代价太高收益太低,也不是什么大项目,有这需求干嘛不换一个语言,大部分工作人家编译期间就做完了。 |