在下面的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「爲什麼人們會覺得靜態類型動態語言的衝動?」 - 因爲它有很多優點。 –