返回类的函数的 Python 类型注释

问题描述 投票:0回答:1

考虑以下代码,它对整数 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 中不可能,那么其他哪些编程语言可以实现这一点?

python mypy typechecking
1个回答
0
投票

要使用 mypy 实现这种类型安全级别(对 IntegersModN 的不同调用会产生不兼容的类型),您可以在 Python 的类型系统中利用泛型和 TypeVar。具体来说,您可以将 TypeVar 与绑定类型一起使用,以确保不同类的实例(即使是相同模数)被 mypy 视为不兼容。

© www.soinside.com 2019 - 2024. All rights reserved.