Python Mypy:只有在应用额外协议的情况下,带有某些方法的通用容器才有效
在mypy中,如何指定类型Python Mypy:只有在应用额外协议的情况下,带有某些方法的通用容器才有效,python,types,mypy,Python,Types,Mypy,在mypy中,如何指定类型GenericoverT的方法只有在T满足某些条件时才有效 例如,如果我们使用min方法创建了一个自定义集合类,返回集合中最小的元素: 从输入import Generic,TypeVar T=类型变量(“T”) 类MyCollection(泛型[T]): 定义初始化(self,some_list:list[T]): self.\u存储=一些\u列表 def min(self)->T:#这要求T实现__ “获取集合中最小的元素” 返回最小值(自存储) 如果T实现了\uu
Generic
overT
的方法只有在T
满足某些条件时才有效
例如,如果我们使用min
方法创建了一个自定义集合类,返回集合中最小的元素:
从输入import Generic,TypeVar
T=类型变量(“T”)
类MyCollection(泛型[T]):
定义初始化(self,some_list:list[T]):
self.\u存储=一些\u列表
def min(self)->T:#这要求T实现__
“获取集合中最小的元素”
返回最小值(自存储)
如果T
实现了\uu lt\uu
,您如何告诉类型系统只允许在T的MyCollection
上调用min
所以基本上我想让泛型容器的一些方法只有在满足额外协议的情况下才有效
--有用的链接--
您可以从中看到,他们已经定义了一个协议来实施\uuuult\uuuuu
类支持小于(协议):
定义(自我、其他:任何)->bool:。。。
SupportsLessThanT=TypeVar(“SupportsLessThanT”,bound=SupportsLessThan)#noqa:Y001
在链接的同一存根文件中,查看列表的类型提示。排序
:
class list(MutableSequence[_T], Generic[_T]):
...
@overload
def sort(self: List[SupportsLessThanT], *, key: None = ..., reverse: bool = ...) -> None: ...
@overload
def sort(self, *, key: Callable[[_T], SupportsLessThan], reverse: bool = ...) -> None: ...
通过类型暗示self
,您可以指定一个方法仅适用于泛型类的某些专门化。您也可以在mypy文档中看到这一点
因此,您的min
将被注释为
def min(self: 'MyCollection[SupportsLessThanT]') -> SupportsLessThanT:
...
对于supportslesshant
的合适定义,我认为python类型系统不支持这一点,只是想澄清一点:您是否希望整个类只接受支持t的t