Python类型检查器无法识别子类实例,提取函数引发Pyright报错
解决Pyright类型检查无法识别自定义类型判断函数的问题
问题出在Pyright无法自动识别你的is_child_instance函数是类型守卫函数——也就是能帮它窄化变量类型的函数。内联的isinstance是Pyright原生支持的类型窄化逻辑,但抽成函数后,需要给函数加上专门的类型注解,告诉类型检查器这个函数的作用。
解决步骤:
- 从
typing(Python 3.10+)或typing_extensions(Python 3.9及以下)导入TypeGuard - 给
is_child_instance函数的返回类型标注为TypeGuard[Child]
修改后的完整代码:
from typing import Any, TypeGuard class Parent: def __init__(self, name: Any): self.name = name class Child(Parent): def __init__(self, name: Any): super().__init__(name) def print_name(self) -> None: print(self.name) def create_instance(arg: Any): if isinstance(arg, int): return Parent(arg) return Child(arg) def is_child_instance(obj: Any) -> TypeGuard[Child]: return isinstance(obj, Child) def main(): instance_a = create_instance("a") instance_1 = create_instance(1) instances = [instance_a, instance_1] for instance in instances: if not is_child_instance(instance): continue instance.print_name() # 现在Pyright不会报错了
原理说明:
TypeGuard[Child]这个注解会告诉Pyright:当is_child_instance返回True时,传入的obj肯定是Child类型。这样在continue跳过非Child实例后,剩下的instance类型会被自动窄化为Child,自然就能正常访问print_name方法了。
如果你的Python版本低于3.10,需要先安装typing_extensions包:
pip install typing_extensions
然后把导入语句改成:
from typing_extensions import TypeGuard
内容的提问来源于stack exchange,提问作者Nick Reid
相关产品推荐
相关产品推荐

