gpt4 book ai didi

python-3.x - 如何在泛型类型上声明 Python 约束以支持 __lt__?

转载 作者:行者123 更新时间:2023-12-03 13:58:24 27 4
gpt4 key购买 nike

在下面的 Python 3.5 代码中,我想使用小于运算符 ( < ) 来比较两个通用值。如何声明 T 上的约束以支持 __lt__ ?

from typing import *
import operator

T = TypeVar('T')

class MyList(Generic[T]):
class Node:
def __init__(self, k:T) -> None:
self.key = k
self.next = None # type: Optional[MyList.Node]

def __init__(self) -> None:
self.root = None # type: Optional[MyList.Node]

def this_works(self, val:T) -> bool:
return self.root.key == val

def not_works(self, val:T) -> bool:
return operator.lt(self.root.key, val)

我正在使用 Mypy键入 check 并且它在 not_works 上失败消息:
$ mypy test.py
test.py: note: In member "not_works" of class "MyList":
test.py:20: error: Unsupported left operand type for < ("T")

其他语言支持对 T 的约束。

在 C# 中: class MyList<T> where T:IComparable<T>
在 Java 中: class MyList<T extends Comparable<? super T>>

最佳答案

你可以通过传递一个额外的参数来实现你的目标 boundTypeVar ,如 PEP484 中所述:

A type variable may specify an upper bound using bound=<type>. This means that an actual type substituted (explicitly or implicitly) for the type variable must be a subtype of the boundary type. A common example is the definition of a Comparable type that works well enough to catch the most common errors:



来自上述 PEP 的示例代码:
from typing import TypeVar

class Comparable(metaclass=ABCMeta):
@abstractmethod
def __lt__(self, other: Any) -> bool: ...
... # __gt__ etc. as well

CT = TypeVar('CT', bound=Comparable)

def min(x: CT, y: CT) -> CT:
if x < y:
return x
else:
return y

min(1, 2) # ok, return type int
min('x', 'y') # ok, return type str

在mypy的最新版本(用0.521验证)中,正确处理了上述场景。

关于python-3.x - 如何在泛型类型上声明 Python 约束以支持 __lt__?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32787411/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com