Python Protocol类型错误:yield返回Type[Foo]与FooProtocol不兼容
解决方法
错误1:类型不匹配(类 vs 实例协议)
你在fixture里返回的是Foo类本身(类型为Type[Foo]),但原FooType是用来描述Foo实例的协议,两者类型完全不匹配。需要把FooType改成描述Foo类结构的协议。
错误2:属性访问权限问题
当协议用于描述类对象时,所有属性必须明确标记为类变量(ClassVar),否则类型检查器会把它们当成实例属性,认为不能通过类直接访问——这就是第二个错误的根源。
修正后的完整代码
- 重新定义
FooType协议:
from typing import Protocol, ClassVar from some_module import Database class FooType(Protocol): bar: ClassVar[str] database: ClassVar[Database]
- 修正fixture的类型标注:
from typing import Generator, Type import pytest @pytest.fixture(autouse=False, scope="session") def foo_fixture() -> Generator[Type[FooType], None, None]: # 顶部无法导入的问题按你的逻辑保留 from some_other_module import Foo yield Foo
关键说明
ClassVar明确告诉类型检查器:这些属性属于类本身而非实例,解决第二个错误。Type[FooType]表示“符合FooType协议的类类型”,和你yield的Foo类类型完全匹配,解决第一个错误。
内容的提问来源于stack exchange,提问作者mehekek
相关产品推荐
相关产品推荐

