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
iorilu
V2EX  ›  Python

大家现在写 Python , 用类型注解吗

  •  
  •   iorilu · 2024-04-24 16:57:32 +08:00 · 5010 次点击
    这是一个创建于 366 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想了解下看看, 可以是几种情况

    • 一点不用
    • 想起来就用一点, 没有强制
    • 函数全部用
    • 函数, 变量所有全部用

    我现在也就是第二种把, 想起来就用一点 , 也没强制整个项目都用,现在想要不要升级下, 更严格一点呢

    57 条回复    2024-07-09 15:07:23 +08:00
    qs
        1
    qs  
       2024-04-24 17:09:35 +08:00
    第三种吧,对于一些没注解的第三方函数会给变量加注解
    gray0
        2
    gray0  
       2024-04-24 17:22:09 +08:00   ❤️ 3
    函数入参/返回值
    ZXiangQAQ
        3
    ZXiangQAQ  
       2024-04-24 17:51:59 +08:00
    入参、出参会注解一下,反正以前也要写 docstring ,直接写注解 docstring 就不需要写类型了,挺方便的
    NoOneNoBody
        4
    NoOneNoBody  
       2024-04-24 17:56:11 +08:00
    能用就用,主要是 pyright 跟踪比较方便
    但 Union 这种就不想写了,还要 import
    vicalloy
        5
    vicalloy  
       2024-04-24 17:56:28 +08:00
    函数都写,变量不一定。
    加了注解后 IDE 更智能,而且配合 mypy 可以检查出不少问题。
    Hopetree
        6
    Hopetree  
       2024-04-24 17:58:46 +08:00
    说实话,很浪费时间,虽然严谨一点,但是很影响效率。如果是公司的项目有要求,我会写,但是自己的项目绝对不写,Python 的优势本来就是灵活、快
    xipuxiaoyehua
        7
    xipuxiaoyehua  
       2024-04-24 18:01:41 +08:00
    第三种
    786375312123
        8
    786375312123  
       2024-04-24 18:06:00 +08:00
    如果想要类型安全,为什么不直接用静态类型语言
    jqtmviyu
        9
    jqtmviyu  
       2024-04-24 18:11:23 +08:00
    最好函数入参返回都写.

    在别人的开源项目上加功能. 结果函数名写的复数, 入参既有 str 又有 list, 难绷.
    inhzus
        10
    inhzus  
       2024-04-24 18:11:25 +08:00
    intelligence 不能推导出类型的就写
    VforVendetta
        11
    VforVendetta  
       2024-04-24 18:12:02 +08:00
    自己的项目第二种,公司项目第四种
    leonshaw
        12
    leonshaw  
       2024-04-24 18:19:37 +08:00
    放弃了,根本写不明白,Union 满天飞,Dict 里面到底是啥,各种 Callable ,更别提 *, ** 的转发了。
    iorilu
        13
    iorilu  
    OP
       2024-04-24 18:21:14 +08:00
    @Hopetree 这个就是个平衡

    写代码时候麻烦点, 为的是以后减少错误, 或 debug 等等耽误的时间, 所以如何平衡也是个人的方式
    Muniesa
        14
    Muniesa  
       2024-04-24 18:22:46 +08:00 via Android
    想起来就写,主要是为了 IDE 的自动补全
    Nich0la5
        15
    Nich0la5  
       2024-04-24 18:45:44 +08:00
    用 不用过两天就忘了自己写了个啥了
    djangovcps
        16
    djangovcps  
       2024-04-24 18:48:19 +08:00
    很难想象多层复合类对象,类中的属性又是其他的类对象,其他类对象又引用了别的对象,不用类型注解写代码没有联想的痛苦
    yanyao233
        17
    yanyao233  
       2024-04-24 18:58:29 +08:00 via Android
    用,并且配合 pydantic ,简直爽歪歪
    tomczhen
        18
    tomczhen  
       2024-04-24 19:59:43 +08:00   ❤️ 1
    都说 Python 灵活,写类型提示也可以灵活点,做二极管大可不必。

    一次性脚本就根据需要 IDE 提示的地方写一下,比如字典取对象,写个提示方便后面代码编写。
    验证的小项目参考上面,然后函数出参入参写一下。
    如果是自己会长期维护,或者必然时间很久之后要修,那就能写的地方就写一下,之后再来看代码就好受点。
    jfcherng
        19
    jfcherng  
       2024-04-24 20:00:49 +08:00
    寫,因為用 IDE 和各種靜態工具爽。另外就是不寫的話,以後回來看就是火葬場。接手了別人的代碼,什麼類型都沒寫,各種入參完全不知道是什麼鬼,費了一堆時間在猜。
    plan9
        20
    plan9  
       2024-04-24 20:10:53 +08:00 via iPhone
    第三种
    vituralfuture
        21
    vituralfuture  
       2024-04-24 20:21:05 +08:00 via Android
    借个楼,各位写 typehint 的时候遇到异步生成器函数没有实现的的情况下如何处理的

    异步生成器,即函数体有 yield 的异步函数,没有实现即它的具体实现在子类中,父类仅仅提供一个接口。如果使用诸如 mypy 这样的严格静态类型检查器,只写个 pass ,因为没有 yield 语句,mypy 就会认为返回类型不是生成器所以报错

    我想到了一个办法就是 yield from 这个函数自己,让 mypy 自己绕圈去,但感觉不够优雅,说到底还是破坏了可读性,用 pass 可以表示函数体为空,没有逻辑。而 yield from 有迷惑性
    jfcherng
        22
    jfcherng  
       2024-04-24 20:29:15 +08:00
    @vituralfuture #21

    def f():
    ... return
    ... yield
    jfcherng
        23
    jfcherng  
       2024-04-24 20:33:22 +08:00
    @vituralfuture #21 不對啊 具體實現在子類的話, 直接 @abstractmethod 不就完事了麼
    chengxiao
        24
    chengxiao  
       2024-04-24 20:50:01 +08:00
    都写注解了 我为什么不用 golang
    wupher
        25
    wupher  
       2024-04-24 21:06:14 +08:00
    最开始是一点不用。那时 py , Ruby, js ,更习惯于 duck type 。

    后来习惯了 Kotlin, Go ,现在尽量全部用。
    vincent7245
        26
    vincent7245  
       2024-04-24 21:36:51 +08:00 via Android
    用,而且我规定公司所有 Python 项目都得用
    sunrisewestern
        27
    sunrisewestern  
       2024-04-24 22:00:41 +08:00
    用 AI 加类型提示
    lijiangang886
        28
    lijiangang886  
       2024-04-24 22:04:13 +08:00
    一个直观的体验提升:写类型注解可以帮助 IDE 进行更好的静态分析,从而提升补全等功能的体验
    XueXianqi
        29
    XueXianqi  
       2024-04-24 22:05:48 +08:00
    response: str = "写,都写,不然就是 “不写一时爽,维护火葬场”"
    print(response)
    jiayouzl
        30
    jiayouzl  
       2024-04-24 22:16:27 +08:00
    工作代码用,自己用的代码从来不写.
    ktyang
        31
    ktyang  
       2024-04-24 22:24:08 +08:00
    比 2 强比 3 差。。。基本重要的都会用
    mark2025
        32
    mark2025  
       2024-04-24 22:32:52 +08:00
    有了那么好的 TS ,还是不少人喜欢无类型的 JS ,py 一样的 ~
    DOLLOR
        33
    DOLLOR  
       2024-04-24 22:40:11 +08:00
    跟 TS 、JSDOC 一样,编辑器能自动推导的类型不写,只写不能自动推导的类型。
    因为编辑器提供智能提示,非常爽。🐶

    v1 = 'string' # 这里不写
    v2 = 1 # 这里也不用写

    def func(arg: SomeType) # 参数不能自动推导,要写。返回值能自动推导,不写。
    MiketsuSmasher
        34
    MiketsuSmasher  
       2024-04-24 22:40:23 +08:00
    @vituralfuture #21 你要做的应该是个抽象类,不如直接用 abc.ABCMeta 作为父类的元类, @ abc.abstractmethod 装饰这个方法,代码块里 raise NotImplementedError ,反正抽象类也不能直接初始化。mypy 也应该识别得到这种情况。
    so1n
        35
    so1n  
       2024-04-24 22:58:06 +08:00
    写,检查工具也用上
    levelworm
        36
    levelworm  
       2024-04-24 23:05:00 +08:00
    我觉得有点复杂的是那种库里头的类型,有时候需要写成 abc.cde.deg 这种一长串——当然可以通过 import 来解决,但是还是觉得很麻烦。C 就没这个问题。
    nuk
        37
    nuk  
       2024-04-24 23:26:56 +08:00
    不用,给自己套枷锁干啥
    ztmzzz
        38
    ztmzzz  
       2024-04-25 00:07:29 +08:00
    ide 不能自动提示的时候写
    locoz
        39
    locoz  
       2024-04-25 02:35:40 +08:00 via Android
    无所谓,反正就是按个 Tab 的事情,打个冒号/横杠给 AI 起个头,AI 就会自己解决这个问题,基本不需要费脑子人工调整。除了那种封装的比较深的框架里的东西 AI 都搞不明白要标啥的以外,其他东西基本都顺手就标了注解。
    jiyan5
        40
    jiyan5  
       2024-04-25 08:30:27 +08:00
    写不写都行,反正都能运行,不是太想写
    lLuO0WljRTqf
        41
    lLuO0WljRTqf  
       2024-04-25 09:57:12 +08:00
    不写,因为不好看。有点背离写 Python 代码简洁的初衷。
    根据必要程度从低到高我一般会划分为以下几类:
    1. 通过变量命名,比如(datalist)之类;
    2. 在函数注解中标明;
    3. 通过 if 对变量类型进行判断,或 raise Error ,或可传入不同类型来获取结果,常面对的场景就是可传文件或者字符串;
    4. 某些特殊情况下通过 assert 卡住过往的值。
    没错,就是不想写。因为敲起来很麻烦。看起来感觉不够简洁,不美。
    个人之见。
    Pters
        42
    Pters  
       2024-04-25 10:21:16 +08:00
    用啊,因为 copilot 自己就会带出来
    moqsien
        43
    moqsien  
       2024-04-25 10:33:15 +08:00
    不写 python 了,写 go ,哈哈
    bwangel
        44
    bwangel  
       2024-04-25 10:45:32 +08:00
    python 中装饰器挺常见的,我发现给装饰器写个类型注解还是挺困难的。

    主要的困难点在于,要求装饰器修饰的函数,类型要一致。多人开发的时候,这个保证有点难。
    Rebely
        45
    Rebely  
       2024-04-25 12:12:03 +08:00
    用, 谁用谁爽
    Zy143L
        46
    Zy143L  
       2024-04-25 13:17:59 +08:00 via Android
    先不写,然后 Ai 补全自动处理
    uni
        47
    uni  
       2024-04-25 14:40:27 +08:00
    写,目标是 vscode 开 basic 检查不报红
    但是 vscode 里面的类型检查还是有不少 bug 的,复杂一点的类型体操就有可能出问题,也是无奈
    gauthier
        49
    gauthier  
       2024-04-25 16:25:37 +08:00
    第三种,函数用。
    xxxccc
        50
    xxxccc  
       2024-04-25 17:19:01 +08:00
    需要 code review 的写,不需要 code review 的不写
    HashV2
        51
    HashV2  
       2024-04-25 18:06:27 +08:00
    之前全用,现在写的一个项目要编译成 c ,如果类型注解写的不准确运行到这块的时候会报错,就很无语,导致现在这个项目的类型注解写的很谨慎
    llsquaer
        52
    llsquaer  
       364 天前
    看来大家都一样嘛。 我是函数中参数不能一眼看出来的就写。。没有智能提示的也写。方便自动提示。
    craiiz
        53
    craiiz  
       364 天前
    函数, 变量所有全部用; 写完之后 pycharm 联想很舒服
    Vaspike
        54
    Vaspike  
       364 天前
    第四种,除非:
    一眼就能看出什么类型的变量和根本找不到具体类型的变量(来自其他库的返回值)
    FYFX
        55
    FYFX  
       358 天前
    写,不过高阶函数那个 Callable 写着真恶心,我的感觉是 python 的类型推导太弱了,有些情况 typehint 写起来比静态类型还麻烦
    moudy
        56
    moudy  
       358 天前
    @NoOneNoBody #4 3.12 省事了很多,Union[list, None] 可以直接写成 list|None
    dule
        57
    dule  
       290 天前
    自己写的暂时没加,感觉代码可读性更差,略丑,都要强类型了写什么 python
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2755 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 11:26 · PVG 19:26 · LAX 04:26 · JFK 07:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.