Pylance与mypy类型提示冲突:__enter__返回值标注及兼容写法
上下文管理器__enter__方法类型注解问题解答
写法正确性
这种标注方式在**Python 3.10+**的类型注解规范里是合法的,但在更早版本或未启用延迟解析的环境中,会存在类未完全定义的问题。mypy能通过全局分析识别类内部的自引用,所以不报错;而Pylance(基于Pyright)默认在解析方法时,类定义尚未完成,因此会提示“CM未定义”。
工具差异原因
这并非某一方的缺陷,而是两者对类型注解的解析时机策略不同:
- mypy采用全局类型分析,能够回溯识别类内部的自引用。
- Pylance默认采用即时解析,在解析
__enter__方法时,CM类还未完成定义,因此抛出未定义提示。
兼容两者的写法
有三种可靠写法可以同时满足mypy和Pylance:
- 字符串字面量标注(兼容所有Python版本)
class CM: def __init__(self): ... def __enter__(self) -> 'CM': return self def __exit__(self, *_): ... - 启用延迟类型解析
在文件顶部导入from __future__ import annotations,此时所有类型注解会被当作字符串延迟解析,无需修改原有标注:from __future__ import annotations class CM: def __init__(self): ... def __enter__(self) -> CM: return self def __exit__(self, *_): ... - 使用
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
相关产品推荐
相关产品推荐

