与 mypy 比较的类型
Comparable types with mypy
我正在尝试创建一个通用的 class 来表示一个值具有下限和上限,并强制执行这些界限。
from typing import Any, Optional, TypeVar
T = TypeVar("T")
class Bounded(object):
def __init__(self, minValue: T, maxValue: T) -> None:
assert minValue <= maxValue
self.__minValue = minValue
self.__maxValue = maxValue
但是,mypy 抱怨说:
error: Unsupported left operand type for <= ("T")
显然输入模块不允许我表达这一点(尽管它 looks like 添加 Comparable
可能在将来发生)。
我认为检查对象是否具有 __eq__
和 __lt__
方法就足够了(至少对于我的用例而言)。目前有什么方法可以在 Python 中表达这个要求,以便 Mypy 理解它吗?
经过更多研究,我找到了一个解决方案:协议。由于它们不是完全稳定的(尚未达到 Python 3.6),因此必须从 typing_extensions
模块中导入它们。
import typing
from typing import Any
from typing_extensions import Protocol
from abc import abstractmethod
C = typing.TypeVar("C", bound="Comparable")
class Comparable(Protocol):
@abstractmethod
def __eq__(self, other: Any) -> bool:
pass
@abstractmethod
def __lt__(self: C, other: C) -> bool:
pass
def __gt__(self: C, other: C) -> bool:
return (not self < other) and self != other
def __le__(self: C, other: C) -> bool:
return self < other or self == other
def __ge__(self: C, other: C) -> bool:
return (not self < other)
现在我们可以将类型定义为:
C = typing.TypeVar("C", bound=Comparable)
class Bounded(object):
def __init__(self, minValue: C, maxValue: C) -> None:
assert minValue <= maxValue
self.__minValue = minValue
self.__maxValue = maxValue
Mypy 很高兴:
from functools import total_ordering
@total_ordering
class Test(object):
def __init__(self, value):
self.value = value
def __eq__(self, other):
return self.value == other.value
def __lt__(self, other):
return self.value < other.value
FBounded(Test(1), Test(10))
FBounded(1, 10)
我正在尝试创建一个通用的 class 来表示一个值具有下限和上限,并强制执行这些界限。
from typing import Any, Optional, TypeVar
T = TypeVar("T")
class Bounded(object):
def __init__(self, minValue: T, maxValue: T) -> None:
assert minValue <= maxValue
self.__minValue = minValue
self.__maxValue = maxValue
但是,mypy 抱怨说:
error: Unsupported left operand type for <= ("T")
显然输入模块不允许我表达这一点(尽管它 looks like 添加 Comparable
可能在将来发生)。
我认为检查对象是否具有 __eq__
和 __lt__
方法就足够了(至少对于我的用例而言)。目前有什么方法可以在 Python 中表达这个要求,以便 Mypy 理解它吗?
经过更多研究,我找到了一个解决方案:协议。由于它们不是完全稳定的(尚未达到 Python 3.6),因此必须从 typing_extensions
模块中导入它们。
import typing
from typing import Any
from typing_extensions import Protocol
from abc import abstractmethod
C = typing.TypeVar("C", bound="Comparable")
class Comparable(Protocol):
@abstractmethod
def __eq__(self, other: Any) -> bool:
pass
@abstractmethod
def __lt__(self: C, other: C) -> bool:
pass
def __gt__(self: C, other: C) -> bool:
return (not self < other) and self != other
def __le__(self: C, other: C) -> bool:
return self < other or self == other
def __ge__(self: C, other: C) -> bool:
return (not self < other)
现在我们可以将类型定义为:
C = typing.TypeVar("C", bound=Comparable)
class Bounded(object):
def __init__(self, minValue: C, maxValue: C) -> None:
assert minValue <= maxValue
self.__minValue = minValue
self.__maxValue = maxValue
Mypy 很高兴:
from functools import total_ordering
@total_ordering
class Test(object):
def __init__(self, value):
self.value = value
def __eq__(self, other):
return self.value == other.value
def __lt__(self, other):
return self.value < other.value
FBounded(Test(1), Test(10))
FBounded(1, 10)