2020 年了,各位拥抱 Python 的类型注释了么? - V2EX
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
guyeu
V2EX    Python

2020 年了,各位拥抱 Python 的类型注释了么?

  •  
  •   guyeu 2020-05-09 11:06:15 +08:00 8277 次点击
    这是一个创建于 2031 天前的主题,其中的信息可能已经有所发展或是发生改变。

    知乎上有个几年前的问题,那时候不用 type hint 的原因主要有以下几点:

    • 不够 Pythonic ;
    • 和旧版本 python 的兼容性要求;
    • 不是强制的,运行时的类型还是没办法预测;
    • 丑;
    • IDE 的支持不好;

    2020 年的今天,上述的有些问题应该已经没了,剩下的问题是不是依然阻碍使用 type hint 呢?

    46 条回复    2020-05-15 17:49:53 +08:00
    Vegetable
        1
    Vegetable  
       2020-05-09 11:10:41 +08:00   1
    用了,IDE 支持已经不错了,所以其他缺点都不算缺点了。
    最近在学习 Fastapi 和 pydantic,很惊艳。
    冷暖自知吧,我个人感觉很好。
    xiaolinjia
        2
    xiaolinjia  
       2020-05-09 11:23:47 +08:00
    用了,挺好的。
    LokiSharp
        3
    LokiSharp  
       2020-05-09 11:29:30 +08:00
    不用,这个特性目前依旧是个高级的注释,运行时没有啥实际作用,我写 Python 就是为了少敲点类型,真需要静态类型的干嘛不换个语言br />更好的 IDE 支持?我写 Python 很多时候就是因为写脚本用编辑器直接敲起来方便,项目复杂度真到到非用 IDE 不可的时候,用 Java C# 之类的工程化的语言不是更香么
    xiaolinjia
        4
    xiaolinjia  
       2020-05-09 11:44:28 +08:00   2
    我感觉看场景,ls 说的只适用于单人开发场景,或者说把场景固定死了在单人小应用(脚本就是其中一种)中使用 py 。我觉得 type hint 在多人协作中就很有用,因为动态类型看着累,并且代码还不都是自己写的。直接配合 ide 提醒就很舒服。不支持 py2 是真的,不过 2 都退休了就算了(虽然我公司的一些项目还在 2,我巴不得 2 也能上)。
    looplj
        5
    looplj  
       2020-05-09 11:48:08 +08:00
    大型项目可以用
    我一般用 Go 和 Java,用 Python 就是为了不写类型的,就不用了。
    xpresslink
        6
    xpresslink  
       2020-05-09 12:04:59 +08:00
    python 比较适合做大量尝试性的开发项目,还有就是一次性的任务,比如爬虫。还有开发工具类的项目,比如运维工具系统的 web 界面之类,还有一些系统和管理后台等。这类项目基本上就是自己一个人玩的项目,写不写注释无所谓。
    LokiSharp
        7
    LokiSharp  
       2020-05-09 12:05:33 +08:00
    @xiaolinjia #4 然而多人场景用真静态类型的语言你会更舒服,性能还比 Python 好一个数量级
    dayeye2006199
        8
    dayeye2006199  
       2020-05-09 12:12:59 +08:00
    可以上 pyre 和 mypy,自动加上类型注释和做类型检查。
    个人脚本可以不加。但多人协作加上这个会对大家心智负担减轻很多。

    Instagram 内部是强制 pyre 检查的,不过不让 commit 的。
    di94sh
        9
    di94sh  
       2020-05-09 12:15:54 +08:00 via iPhone   2
    当你一直要处理复杂数据结构的时候,你就是到 type hint 多香了。dict 传来传去到最后自己都不知道里面是啥
    JJstyle     10
    JJstyle  
       2020-05-09 12:19:53 +08:00 via iPhone
    说实话,写这玩意很累
    Liyiw
        11
    Liyiw  
       2020-05-09 12:25:26 +08:00
    我感觉你说的前 4 点不会因为是 2020 的今天就没了吧
    这些问题不是一直存在的吗
    莫非 python 把 type hinting 的语法改了?
    so1n
        12
    so1n  
       2020-05-09 12:31:04 +08:00 via Android
    用了,除了工程化外解析程序和 api 接口类型检验时也很好用
    jjx
        13
    jjx  
       2020-05-09 12:53:51 +08:00
    还停留在 python 2
    Mohanson
        14
    Mohanson  
       2020-05-09 13:01:06 +08:00
    python 许多标准库都加上 hint 了, 有什么理由不用呢...
    009694
        15
    009694  
       2020-05-09 13:25:41 +08:00   1
    用 而且用的很多。 就我平常用的最多的 matplotlib 来说 pycahrm 对 axes 的提示几乎没有 都靠记忆太累了,加上 type hint 之后 所有提示都有了,整体心智负担指数级下降
    jsq2627
        16
    jsq2627  
       2020-05-09 13:46:07 +08:00
    t/656654
    似曾相识的话题
    pakro888
        17
    pakro888  
       2020-05-09 13:53:19 +08:00
    好用,尤其是过一段时间再看项目,很有帮助
    locoz
        18
    locoz  
       2020-05-09 13:59:59 +08:00
    用,写习惯了 Golang 之后写 Python 的时候加类型注解完全就是顺手而为,毫无麻烦感
    paoqi2048
        19
    paoqi2048  
       2020-05-09 14:03:25 +08:00
    准备试试
    yhxx
        20
    yhxx  
       2020-05-09 14:04:05 +08:00
    有种在说 typescript 的感觉

    其实我也一直觉得要是想要静态类型我换个语言就是了,用 python 就是不想写类型啊
    niubee1
        21
    niubee1  
       2020-05-09 14:06:31 +08:00
    有个很扯的问题,我要返回类本身的时候,会报错,那么就是说我不能定义链式调用咯,太扯了
    TransAM
        22
    TransAM  
       2020-05-09 14:08:20 +08:00 via Android
    类型标注只支持类,不支持协议。比如 list 协议和 list 类是不一样的,标成 list 类就会频繁崩溃。
    cominghome
        23
    cominghome  
       2020-05-09 14:20:01 +08:00
    试用过一段时间,感觉就是个高级注释,对我来说没啥用。。。
    guyeu
        24
    guyeu  
    OP
       2020-05-09 14:26:07 +08:00
    @niubee1 #21 可以标注为 Type[ClassName]或者 Callable 类型
    guyeu
        25
    guyeu  
    OP
       2020-05-09 14:27:15 +08:00
    @TransAM #22 没懂这个协议指的是啥。。。它标注的是变量、参数和返回值的类型,这个协议如果是一种类型就可以。
    6ugman
        26
    6ugman  
       2020-05-09 15:34:01 +08:00
    @TransAM 是支持各种鸭子“协议”,比如你需要 typing.Sequence
    rockyou12
        27
    rockyou12  
       2020-05-09 16:05:30 +08:00
    对我这样的 java 写了好多年,才开始学 python 的很有用。特别是看课程给的代码,我都要自己给加上类型再写一遍,不然真的记不住有些什么 api……
    Drahcir
        28
    Drahcir  
       2020-05-09 16:52:45 +08:00
    准备开始规范化使用类型标注。
    是一个代码风格的问题,开始会觉得挺麻烦,但熟悉以后对代码质量有很大帮助。
    当然还有规范化注释也很重要。
    wzw
        29
    wzw  
       2020-05-09 17:52:55 +08:00 via iPhone
    我直接转 go 了
    Trim21
        30
    Trim21  
       2020-05-09 17:54:47 +08:00
    @niubee1 #21 把类型用引号包起来就行了
    scorn
        31
    scorn  
       2020-05-09 17:54:53 +08:00
    我都用 python 还写个什么静态类型
    fox0001
        32
    fox0001  
       2020-05-09 17:56:43 +08:00 via Android
    我拥抱 go[狗头]
    lights
        33
    lights  
       2020-05-09 18:08:22 +08:00
    弱类型一时爽,重构火葬场
    superrichman
        34
    superrichman  
       2020-05-09 18:12:13 +08:00 via iPhone
    没有,不如一句注释来的直观。
    都用 python 了,不想搞静态语言那套东西
    zhustec
        35
    zhustec  
       2020-05-09 18:13:00 +08:00
    一直没搞懂指向自身类型该怎么写

    ```python
    class Node:
    value: int
    prev: ??
    next: ??
    ```
    labulaka521
        36
    labulaka521  
       2020-05-09 18:34:51 +08:00 via Android
    拥抱不了转 go 了
    BaseVariable
        37
    BaseVariable  
       2020-05-09 18:43:23 +08:00
    @dayeye2006199 老哥,好像 pyre 和 mypy 是做类型检查的吧,哪个可以自动加类型注释呢?
    no1xsyzy
        38
    no1xsyzy  
       2020-05-09 18:51:33 +08:00
    dataclass + dacite 写舒服了
    其他地方不用,但碰到 JSON API 要解析只用注解来解析。
    no1xsyzy
        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 )
    zhustec
        40
    zhustec  
       2020-05-09 18:57:21 +08:00
    @no1xsyzy

    这样写也太丑了
    no1xsyzy
        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 辅助项。
    reedthink
        42
    reedthink  
       2020-05-09 19:11:23 +08:00
    方向错了
    hspeed18
        43
    hspeed18  
       2020-05-09 19:16:45 +08:00
    要 type hint 为什么不直接用静态语言
    levelworm
        44
    levelworm  
       2020-05-10 04:05:30 +08:00 via Android
    一直在用,主要是给自己看,不然过一阵子未必回忆的起来。
    skinny
        45
    skinny  
       2020-05-10 08:13:36 +08:00
    有的代码用,觉得非常非常丑 + 麻烦,而且很多功能 docstring 也可以解决,更精简。至于 IDE 支持,我就遇到过连 PyCharm 都根本不识别的情况(比如 ThreadPoolExecutor ),现在好像已经修复了。

    有的类型你一写容易变得非常长,加上名字还不能短,名字短有的你会忘记到底是干什么的,跟没有一样,也不是非常复杂的数据结构,就字典这种,虽然你可以单独在一行构建类型,后面使用,但是一层层套下来也是不够直观的,而且很多时候一个参数一行都很长,类型就占了大半,还多半用处不大,而且你用 PyCharm 看还是得各种跳转。即便你写了类型,很多时候依然要做运行时检查,比如类似于 reuquests.get 的 params 这种参数。

    写着写着你会觉得代价太高收益太低,也不是什么大项目,有这需求干嘛不换一个语言,大部分工作人家编译期间就做完了。
    TransAM
        46
    TransAM  
       2020-05-15 17:49:53 +08:00 via Android
    @6ugman 自定义协议呢?比如我的协议 a 包含 b 和 c 两个方法,怎么标
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5727 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 01:58 PVG 09:58 LAX 17:58 JFK 20:58
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86