Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Mypy:只有在应用额外协议的情况下,带有某些方法的通用容器才有效_Python_Types_Mypy - Fatal编程技术网

Python 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

在mypy中,如何指定类型
Generic
over
T
的方法只有在
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