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 · 7602 次点击
    这是一个创建于 1667 天前的主题,其中的信息可能已经有所发展或是发生改变。

    知乎上有个几年前的问题,那时候不用 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 就是为了少敲点类型,真需要静态类型的干嘛不换个语言
    更好的 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 也能上)。
    ZSeptember
        5
    ZSeptember  
       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
    https://www.v2ex.com/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   ·   实用小工具   ·   2596 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:09 · PVG 14:09 · LAX 22:09 · JFK 01:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.