首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mypy:带有某些方法的通用容器只有在应用额外协议时才有效

Mypy:带有某些方法的通用容器只有在应用额外协议时才有效
EN

Stack Overflow用户
提问于 2020-12-01 04:57:03
回答 1查看 424关注 0票数 1

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

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

代码语言:javascript
运行
复制
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__时,才允许在TMyCollection上调用min

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

--有用的链接--

您可以从typehints in the standardlib for min中看到,他们已经定义了一个用于实施__lt__的协议

代码语言:javascript
运行
复制
class SupportsLessThan(Protocol):
    def __lt__(self, __other: Any) -> bool: ...

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-01 19:15:03

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

代码语言:javascript
运行
复制
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将被注释为

代码语言:javascript
运行
复制
def min(self: 'MyCollection[SupportsLessThanT]') -> SupportsLessThanT:
    ...

SupportsLessThanT有一个合适的定义。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65081082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档