Mypy:只有在应用额外协议的情况下,带有某些方法的通用容器才有效

2024-03-29 07:29:12 发布

您现在位置:Python中文网/ 问答频道 /正文

在mypy中,如何指定T上的类型Generic具有仅在T满足某些条件时才有效的方法

例如,如果我们使用min方法创建了一个自定义集合类,返回集合中最小的元素:

from typing import Generic, TypeVar

T = TypeVar("T")

class MyCollection(Generic[T]):
    
    def __init__(self, some_list: List[T]):
        self._storage = some_list

    def min(self) -> T: # This requires that T implements __lt__
        "Get the smallest element in the collection"
        return min(self._storage)     

如何告诉类型系统只有在T实现__lt__时才允许对MyCollectionmin进行调用

所以基本上我想让泛型容器的一些方法只有在满足额外协议的情况下才有效

--有用的链接--

您可以从typehints in the standardlib for min中看到,他们已经定义了一个协议来执行__lt__

class SupportsLessThan(Protocol):
    def __lt__(self, __other: Any) -> bool: ...

SupportsLessThanT = TypeVar("SupportsLessThanT", bound=SupportsLessThan)  # noqa: Y001

Tags: the方法inltself类型defstorage
1条回答
网友
1楼 · 发布于 2024-03-29 07:29:12

在链接的同一存根文件中,查看list.sort的类型提示:

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文档中看到这个documented

因此,您的min将被注释为

def min(self: 'MyCollection[SupportsLessThanT]') -> SupportsLessThanT:
    ...

具有合适的SupportsLessThanT定义

相关问题 更多 >