首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >键入通用可调用Bug

键入通用可调用Bug
EN

Stack Overflow用户
提问于 2022-06-04 12:07:21
回答 1查看 241关注 0票数 0

由于某些原因,无法正确键入可调用的类型。下面的代码会在Pylance和mypy中引发错误。

示例代码

所以如果所有这些不变的,协变的和反变的抛出一个异常。如何才能将Callable泛型化?

代码语言:javascript
复制
from typing import Generic, TypeVar, Any, Callable

class BaseModel:
    ...

class Model(BaseModel):
    ...

_T = TypeVar("_T")
_T_co = TypeVar("_T_co", covariant=True)
_T_contra = TypeVar("_T_contra", contravariant=True)

class Dispatcher(Generic[_T, _T_co, _T_contra]):
    def add_callback(self, func: Callable[[_T], Any]) -> None:
        ...

    def add_callback_co(self, func: Callable[[_T_co], Any]) -> None:
        ...

    def add_callback_contra(self, func: Callable[[_T_contra], Any]) -> None:
        ...

    def add_mod(self, mod: _T) -> None:
        ...

module_dispatcher: Dispatcher[BaseModel, BaseModel, BaseModel] = Dispatcher()

def call_me(model: Model) -> None:
    ...

module_dispatcher.add_callback(call_me)  # Throws incompatibility
module_dispatcher.add_callback_co(call_me)  # Throws incompatibility
module_dispatcher.add_callback_contra(call_me)  # Throws incompatibility
module_dispatcher.add_mod(Model())  # This is OK

类型/幽门输出

我只抱怨Callableadd_mod方法进行泛型类型推断。

代码语言:javascript
复制
/tmp/testing.py:35: error: Argument 1 to "add_callback" of "Dispatcher" has incompatible type "Callable[[MyModel], None]"; expected "Callable[[MyBaseModel], Any]"
EN

回答 1

Stack Overflow用户

发布于 2022-06-04 12:23:36

这是因为函数的类型在它们的论点中是相反的。

funcmodule_dispatcher.add_callback的参数必须能够接受MyBaseModel的任何实例。

要了解原因,请注意您也可以执行module_dispatcher.add_mod(MyOtherModel()) (当然,假设是issubclass(MyOtherModel, MyBaseModel) )。现在,将使用不是MyModel实例的东西来调用MyModel

我提出的解决办法:

代码语言:javascript
复制
def call_me(model: MyBaseModel) -> None:
    ...

如果这不适用于您,我将需要更多地了解Dispatcher类所需的行为。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72499604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档