You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pylance与mypy类型提示冲突:__enter__返回值标注及兼容写法

上下文管理器__enter__方法类型注解问题解答

写法正确性

这种标注方式在**Python 3.10+**的类型注解规范里是合法的,但在更早版本或未启用延迟解析的环境中,会存在类未完全定义的问题。mypy能通过全局分析识别类内部的自引用,所以不报错;而Pylance(基于Pyright)默认在解析方法时,类定义尚未完成,因此会提示“CM未定义”。

工具差异原因

这并非某一方的缺陷,而是两者对类型注解的解析时机策略不同:

  • mypy采用全局类型分析,能够回溯识别类内部的自引用。
  • Pylance默认采用即时解析,在解析__enter__方法时,CM类还未完成定义,因此抛出未定义提示。

兼容两者的写法

有三种可靠写法可以同时满足mypy和Pylance:

  1. 字符串字面量标注(兼容所有Python版本)
    class CM:
        def __init__(self):
            ...
        def __enter__(self) -> 'CM':
            return self
        def __exit__(self, *_):
            ...
    
  2. 启用延迟类型解析
    在文件顶部导入from __future__ import annotations,此时所有类型注解会被当作字符串延迟解析,无需修改原有标注:
    from __future__ import annotations
    
    class CM:
        def __init__(self):
            ...
        def __enter__(self) -> CM:
            return self
        def __exit__(self, *_):
            ...
    
  3. 使用Self类型(Python 3.10+推荐)
    从typing(3.10+也可从types)导入Self类型,明确标注返回自身实例:
    from typing import Self
    
    class CM:
        def __init__(self):
            ...
        def __enter__(self) -> Self:
            return self
        def __exit__(self, *_):
            ...
    

内容的提问来源于stack exchange,提问作者jackal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 02:32:08