考虑以下代码,它对整数 mod n 进行建模:
def IntegersModN(n):
class InternalClass:
def __init__(self, x):
self.x = x % n
def __add__(self, other):
return self.__class__(self.x + other.x)
def __str__(self):
return str(self.x)
return InternalClass
IntegersMod5 = IntegersModN(5)
print(IntegersMod5(4) + IntegersMod5(2)) # output: 1
运行良好。但是假设我想添加类型注释以静态地确保我永远不会做类似的事情:
IntegersMod4 = IntegersModN(4)
IntegersMod5 = IntegersModN(5)
print(IntegersMod4(1) + IntegersMod5(2)) # desired mypy error
我知道可能无法静态检查 mods 是否相等,但我希望至少有一种方法可以区分由 IntegersModN
构造的
every类。换句话说,我希望每次调用
IntegersModN
都能生成一个新的 InternalClass
,它只允许添加其自身的两个元素。特别是,以下代码也应该抛出 mypy 错误:
IntegersMod5_1 = IntegersModN(5)
IntegersMod5_2 = IntegersModN(5)
print(IntegersMod5_1(1) + IntegersMod5_2(2)) # desired mypy error
这可能吗? (我尝试在
__add__(self, other)
中的参数中添加 Self 注释,但这似乎没有做任何事情。使用 Python 3.13。)此外,如果在 Python 中不可能,那么其他哪些编程语言可以实现这一点?
要使用 mypy 实现这种类型安全级别(对 IntegersModN 的不同调用会产生不兼容的类型),您可以在 Python 的类型系统中利用泛型和 TypeVar。具体来说,您可以将 TypeVar 与绑定类型一起使用,以确保不同类的实例(即使是相同模数)被 mypy 视为不兼容。