为什么 mypy 不理解这个对象实例化?

Why won't mypy understand this object instantiation?

我正在尝试定义一个 class,它将另一个 class 作为属性 _model,并将实例化那个 class 的对象。

from abc import ABC
from typing import Generic, TypeVar, Any, ClassVar, Type

Item = TypeVar("Item", bound=Any)


class SomeClass(Generic[Item], ABC):
    _model: ClassVar[Type[Item]]

    def _compose_item(self, **attrs: Any) -> Item:
        return self._model(**attrs)

我认为 self._model(**attrs) returns 是 Item 的一个实例应该很明显,因为 _model 被显式声明为 Type[Item]attrs 声明为 Dict[str, Any].

但我从 mypy 0.910 得到的是:

test.py: note: In member "_compose_item" of class "SomeClass":
test.py:11: error: Returning Any from function declared to return "Item"
            return self._model(**attrs)
            ^

我做错了什么?

MyPy 有时对 类 的类型有点搞笑。您可以通过将 _model 指定为 Callable[..., Item](毕竟这不是 谎言 )而不是 Type[Item]solve this

from abc import ABC
from typing import Generic, TypeVar, Any, ClassVar, Callable

Item = TypeVar("Item")


class SomeClass(Generic[Item], ABC):
    _model: ClassVar[Callable[..., Item]]

    def _compose_item(self, **attrs: Any) -> Item:
        return self._model(**attrs)