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

pyright 如何忽略某个导入模块引发的类型问题?

  •  
  •   NoOneNoBody · 2023-07-06 16:58:43 +08:00 · 1099 次点击
    这是一个创建于 504 天前的主题,其中的信息可能已经有所发展或是发生改变。
    例如 pandas
    pandas.read_csv 返回 dataframe|textfilereader 两种类型,但实际上绝大部分都是前者,后者遇到时可以作为异常处理就好了
    而这个返回类型导致后续每行,使用这个返回变量的语句都会报类型错误,一大堆飘红

    gb = dataframe.groupby(colnames, as_index=True)
    sized = gb.size() # type: pd.Series
    后一句飘红
    依据文档,as_index=True 时,gb.size()返回 series ,但 pyright 不能识别,仍然检查报告 dataframe 不符合类型
    我可以理解 pyright 没那么智能,所以需要排除各种状况

    没搜到(没读懂?)如何忽略某个 import module 引发的类型检查?
    第 1 条附言  ·  2023-07-06 20:34:41 +08:00
    初步解决:
    调整 pyright 的提醒级别 (error 是红色下划线,information 只是浅色虚线下划线)
    在文件靠近开头加上一行,大概就是解释器和编码声明下一行
    类似这样:
    =================
    # pyright: basic, reportGeneralTypeIssues=information, reportOptionalMemberAccess=information, reportOptionalIterable=information
    =================
    分开几行也是可以的,每行以# pyright: 开头就行

    参考这里的说明:
    https://github.com/microsoft/pyright/blob/main/docs/comments.md
    PS: 如果不用 basic 而用 strict 的话,更多飘红,😱

    后面的各项参数和值,参考这个:
    https://github.com/microsoft/pyright/blob/main/docs/configuration.md#type-check-diagnostics-settings

    上述是文件级的,也可以项目级的,参考:
    https://stackoverflow.com/questions/68822660/how-do-you-ignore-specific-pyright-type-checks-by-project-file-line
    10 条回复    2023-07-06 21:01:05 +08:00
    pursuer
        1
    pursuer  
       2023-07-06 17:20:16 +08:00   ❤️ 1
    只说类型转换,可以用 typing.cast
    Belmode
        2
    Belmode  
       2023-07-06 18:17:49 +08:00   ❤️ 1
    这不就是最基本的类型检查,和类型转换么...
    jfcherng
        3
    jfcherng  
       2023-07-06 18:46:15 +08:00   ❤️ 1
    > 依据文档,as_index=True 时,gb.size()返回 series ,但 pyright 不能识别,仍然检查报告 dataframe 不符合类型

    聽起來像是沒有安裝 https://pypi.org/project/pandas-stubs/ , 要不安裝到環境後重啟 pyright 試試?
    NoOneNoBody
        4
    NoOneNoBody  
    OP
       2023-07-06 19:24:23 +08:00
    @jfcherng #3
    刚才装了,sublime+lsp_pyright 依旧
    vscode+pylance 之前没装 pandas-stubs 也没这些问题,只是我现在转到 sublime 搞不定了,都是基于 pyright ,搞不清两者区别

    暂时是逐行加# type: ignore 跳过,不过想找治本方法
    jfcherng
        5
    jfcherng  
       2023-07-06 19:56:13 +08:00
    @NoOneNoBody #4 pylance 是自帶 stubs 的
    jfcherng
        6
    jfcherng  
       2023-07-06 20:16:44 +08:00
    我這邊裝了 pandas-stubs 以後是正常的
    NoOneNoBody
        7
    NoOneNoBody  
    OP
       2023-07-06 20:40:20 +08:00
    @jfcherng #6
    你试试把 # type: Series 加在 size()后面,加这注释才是类型指定
    jfcherng
        8
    jfcherng  
       2023-07-06 20:43:53 +08:00
    @NoOneNoBody #7 ??? 為什麼要做這種事情,pyright 的類型甚至比你指定的更精確
    NoOneNoBody
        9
    NoOneNoBody  
    OP
       2023-07-06 20:50:50 +08:00
    @jfcherng #8
    其实初心不是为了校验的,只是为了标记一下,review 时能想起是什么类型,只是顺带做校验而已
    jfcherng
        10
    jfcherng  
       2023-07-06 21:01:05 +08:00
    校驗有問題本來就會標紅色,全 project 的校驗直接 mypy 走起

    review 想起類型其實也不用那麼麻煩,但是 ST 這邊現在比較尷尬,因為純正的 pyright 並沒有 inlay hint 功能,隔壁的 coc-pyright 自己實現了 inlay hint 以及其他功能。

    以前我是直接搞 LSP-pylance ,但是後來微軟發信警告我 license 不允許我這麼做,於是 github 上的 LSP-pylance 我下架了。Pylance 有 inlay hint ,就是微軟的 license 只准在自己的編輯器用。Pylance in ST 的效果,有能力的自己私底下可以搞個...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1073 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 19:21 · PVG 03:21 · LAX 11:21 · JFK 14:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.