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

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

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

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

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

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

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

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

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

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

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

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

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

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

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