我试图定义一个类,它将另一个类作为属性
_model
,并将实例化该类的对象。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)
返回的是一个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)
^
我做错了什么?
**attrs: Any
几乎失去了所有类型安全性吗?这与Alex的回答有关:Item
的__init__
可以具有任何签名。你考虑过更具体的方式,例如使用Callable[[int, str, bool], Item]
(带有适当的参数类型)吗? - joelbound=Any
真的没有任何意义... 它根本不应该有一个边界。Any
是一种特殊类型,基本上意味着“不要对此进行类型检查”。我甚至认为它并没有定义为 TypeVar 的边界应该如何工作。 - juanpa.arrivillaga--strict
设置运行 MyPy 时才会出现错误(即使您没有为TypeVar
指定bound=Any
,我同意这是毫无意义的)。https://mypy-play.net/?mypy=latest&python=3.10&flags=strict&gist=15af7faff026f30f18b411ac099ff478 - Alex Waygood