我怎样才能暗示一种类型与打字可比

发布于 2021-01-29 16:06:05

假设我想编写一个比较排序函数,则可以暗示输入必须是一个序列Sequence[T]MutableSequence[T]在这种情况下)。

from typing import MutableSequence, T

def comparison_sort(s: MutableSequence[T]) -> None:
    pass

但是,似乎没有开箱即用的方式暗示T必须具有可比性。(似乎没有Comparable或没有Ordered任何东西typing。)如何实现此目的?我想避免指定一组特定的类型,如intfloat“str`以便用户也可以暗示自己的类型是可比的。

关注者
0
被浏览
66
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如注释中所述,Comparable这不是存在的状态,它仅作为一对类型的描述符才有意义。通常情况下,一个排序功能正在与同质类型的,所以只要你不介意的类型检查只是处理的“支持的概念<与某些类型的”,而不是“支持<任意类型”,您可以定义自己Comparable和绑定一个typing
    TypeVar。方便地,PEP484(定义了typing提示)已经提供了如何执行此操作的示例

    from abc import ABCMeta
    from typing import Any, TypeVar
    
    class Comparable(metaclass=ABCMeta):
        @abstractmethod
        def __lt__(self, other: Any) -> bool: ...
    
    CT = TypeVar('CT', bound=Comparable)
    

    然后,您可以将其用于comparable_sort定义:

    def comparable_sort(s: MutableSequence[CT]) -> None:
    

    注意,我只需要__lt__定义即可;通常,Python
    3完全根据__lt__(不使用任何其他丰富的比较器运算符,甚至不使用†__eq__)来实现自己的排序功能,所以以相同的方式设计自己的算法是一个好主意,因此可以处理,您可以以相同的方式处理。sorted

    †:Python 2最初__le__在至少一个地方(heapq)使用,但是__lt__在Python
    3时间范围内,有意地,始终如一地使用了内置函数和标准库,并且您的键入样式始终是Python 3。



推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看