在下面的Python 3.5代码中,我想使用小于运算符(<
)来比较两个通用值。我如何在T上声明一个约束来支持__lt__
?如何在泛型类型上声明Python约束来支持__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键入检查和它的失败上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>>
为什么人们会觉得静态类型动态语言的冲动?顺便说一句,你为什么不尝试首先定义'__ge__'('__ge__'是'__lt__'的右侧版本)。 “this_works”的工作原理是因为所有类都定义了__eq__。 – JBernardo
@JBernardo“为什么人们会觉得静态类型动态语言的冲动?” - 因为它有很多优点。 –