为什么 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)
我正在尝试定义一个 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)