我希望用 mypy 做一些标准的多态性,我以前从未使用过它,而且到目前为止还不够直观。
基础级
class ContentPullOptions:
pass
class Tool(Protocol):
async def pull_content(self, opts: ContentPullOptions) -> str | Dict[str, Any]: ...
子类
class GoogleSearchOptions(ContentPullOptions):
query: str
sites: List[str]
class GoogleSearchTool(Tool):
async def pull_content(
self,
opts: GoogleSearchOptions,
) -> str | Dict[str, Any]:
失败:
error: Argument 1 of "pull_content" is incompatible with supertype "Tool"; supertype defines the argument type as "ContentPullOptions"
像这样在 mypy 中通过类型检查进行基本继承的最可维护和最简洁的方法是什么?
我尝试了自定义类型、铸造等。但一切都感觉有点混乱和不清楚。
重写方法的类型,为了符合里氏替换原则,必须是继承方法的子类型。因为函数的参数类型是逆变的,这意味着重写方法的参数类型必须是继承方法的“超类型”。也就是说,GoogleSearchTool.pull_content
必须接受一个
至少与
ContentPullOptions
一样普遍的论点,而不是更具体的东西。