推荐学习书目
› 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 · May 9, 2020 · 9198 views
    This topic created in 2373 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

    ```python
    class Node:
    value: int
    prev: ??
    next: ??
    ```
    labulaka521
    labulaka521
    May 9, 2020 via Android
    36
    拥抱不了转 go 了
    BaseVariable
    BaseVariable
    May 9, 2020
    37
    @dayeye2006199 老哥,好像 pyre 和 mypy 是做类型检查的吧,哪个可以自动加类型注释呢?
    no1xsyzy
    no1xsyzy
    May 9, 2020
    38
    dataclass + dacite 写舒服了
    其他地方不用,但碰到 JSON API 要解析只用注解来解析。
    no1xsyzy
    no1xsyzy
    May 9, 2020
    39
    @zhustec #35

    class Node:
    value: int
    prev: 'Node'
    next: 'Node'

    确实很诡异,注解里写上字符串是 Forward Reference
    要字符串本身的话需要 Literal['Node'] 这样(>=3.8 )
    zhustec
    zhustec
    May 9, 2020
    40
    @no1xsyzy

    这样写也太丑了
    no1xsyzy
    no1xsyzy
    May 9, 2020
    41
    @zhustec #40 不能同意更多,写着写着突然说未定义,意识到需要加引号,也是心智负担。
    所以我拿注解只用来解析 JSON API,写完 dataclass 以后
    dacite.from_dict(SomeDataClass, some_dict) 就能把它变成一个 dataclass,支持 List Optional Union 等一众 typing 辅助项。
    reedthink
    reedthink
    May 9, 2020
    42
    方向错了
    hspeed18
    hspeed18
    May 9, 2020
    43
    要 type hint 为什么不直接用静态语言
    levelworm
    levelworm
    May 10, 2020 via Android
    44
    一直在用,主要是给自己看,不然过一阵子未必回忆的起来。
    skinny
    skinny
    May 10, 2020
    45
    有的代码用,觉得非常非常丑 + 麻烦,而且很多功能 docstring 也可以解决,更精简。至于 IDE 支持,我就遇到过连 PyCharm 都根本不识别的情况(比如 ThreadPoolExecutor ),现在好像已经修复了。

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

    写着写着你会觉得代价太高收益太低,也不是什么大项目,有这需求干嘛不换一个语言,大部分工作人家编译期间就做完了。
    TransAM
    TransAM
    May 15, 2020 via Android
    46
    @6ugman 自定义协议呢?比如我的协议 a 包含 b 和 c 两个方法,怎么标
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1446 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 98ms · UTC 15:53 · PVG 23:53 · LAX 07:53 · JFK 10:53
    ♥ Do have faith in what you're doing.