我怎样才能暗示一种类型与打字可比
假设我想编写一个比较排序函数,则可以暗示输入必须是一个序列Sequence[T]
(MutableSequence[T]
在这种情况下)。
from typing import MutableSequence, T
def comparison_sort(s: MutableSequence[T]) -> None:
pass
但是,似乎没有开箱即用的方式暗示T
必须具有可比性。(似乎没有Comparable
或没有Ordered
任何东西typing
。)如何实现此目的?我想避免指定一组特定的类型,如int
,float
“str`以便用户也可以暗示自己的类型是可比的。
-
如注释中所述,
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。
-
我怎样才能告诉PyCharm参数期望是什么类型?
2021-01-29 关注 0 浏览78 1答案
-
为什么我不能在Go中用一种类型的切片替代另一种类型?
2021-02-01 关注 0 浏览81 1答案
-
我怎样才能找到404?
2021-02-02 关注 0 浏览94 1答案
-
Java:如何将变量从一种类型动态转换为另一种类型?
2021-02-02 关注 0 浏览110 1答案
-
我怎样才能洗牌一个数组?
2022-03-22 关注 0 浏览41 1答案
-
我怎样才能逃脱单引号?
2022-07-28 关注 0 浏览10 1答案
-
一种将一种类型的切片转换为等效类型的切片的优雅方法?
2021-02-01 关注 0 浏览76 1答案
-
如何将一种数字类型的切片转换为另一种类型
2021-02-01 关注 0 浏览111 1答案
-
我怎样才能显示提交做了什么?
2022-05-26 关注 0 浏览9 1答案
-
我怎样才能对ArrayList进行排序?
2021-01-30 关注 0 浏览71 1答案