如何为与实例同类型的实例属性标注Self类型提示?
解决用
Self标注实例变量时的mypy类型不兼容问题 当你尝试用Self标注类的实例变量并赋值self时,mypy报错Foo与Self类型不兼容,这是因为旧版mypy对Self的类型推断存在局限,可通过以下几种方式解决:
方案1:升级mypy到最新版本
Python 3.11+原生支持typing.Self,mypy 0.990及以上版本能正确识别self的类型为Self,此时你的原代码可以直接通过类型检查:
from typing import Self class Foo: var: Self def bar(self) -> None: self.var = self
方案2:使用字符串形式的"Self"标注
如果无法升级mypy,将实例变量的类型标注改为字符串形式的"Self",让mypy延迟解析类型直到类定义完成:
from typing import Self class Foo: var: "Self" def bar(self) -> None: self.var = self
方案3:用TypeVar绑定自身(兼容更早Python版本)
对于Python 3.11之前的版本,可使用TypeVar绑定自身类型,同时给self标注对应的类型变量,确保继承时子类的类型能正确传递:
from typing import TypeVar T = TypeVar('T', bound='Foo') class Foo: var: T def bar(self: T) -> None: self.var = self
这种方式下,子类继承后var的类型会自动对应子类:
class Bar(Foo): pass b = Bar() b.bar() # mypy会识别b.var的类型为Bar
内容的提问来源于stack exchange,提问作者jb78685
相关产品推荐
相关产品推荐

