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

Python Protocol类型错误:yield返回Type[Foo]与FooProtocol不兼容

解决方法

错误1:类型不匹配(类 vs 实例协议)

你在fixture里返回的是Foo类本身(类型为Type[Foo]),但原FooType是用来描述Foo实例的协议,两者类型完全不匹配。需要把FooType改成描述Foo类结构的协议。

错误2:属性访问权限问题

当协议用于描述类对象时,所有属性必须明确标记为类变量(ClassVar),否则类型检查器会把它们当成实例属性,认为不能通过类直接访问——这就是第二个错误的根源。


修正后的完整代码

  1. 重新定义FooType协议:
from typing import Protocol, ClassVar
from some_module import Database

class FooType(Protocol):
    bar: ClassVar[str]
    database: ClassVar[Database]
  1. 修正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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:53:21