如何使通用代理类型与静态类型检查器一起工作

How to make generic proxy types work with static type checkers

我正在编写一个 ORM 包装器,它允许编写带有类型注释的模型定义。我现在想添加泛型类型 Unique[T]Index[T]Primary[T] 来注释具有相应约束的类型。但是,我希望这些类型成为 IDE 和其他静态类型检查器的 T 的透明代理。所以如果一个人有这样的类型:

something: Unique[str]

类型检查器和 IDE 就像它说的那样:

something: str

当前的实现是:

T = TypeVar('T')
class Unique(Generic[T]):
    def __new__(cls, *args, **kwargs):
        raise TypeError(f'cannot instantiate {cls}')

有没有办法把它变成某种代理类型?

据我所知,没有符合 PEP 484 的方法可以做到这一点。

但是,如果您专门使用 mypy,则可以编写一个插件来支持此用例。唯一的缺点是插件系统仍然很新并且在不断变化,因此故意记录得很差——如果你想尝试使用它,你应该准备好做一些挖掘。

但是,如果您只想将 'Unique'、'Index' 和 'Primary' 约束应用于固定数量的类型,您或许可以使用 NewType ,像这样:

from typing import NewType

UniqueInt = NewType('UniqueInt', int)
UniqueStr = NewType('UniqueStr', str)
# etc...

这有点 hacky,但它确实 允许您创建现有具体类型的不同子类,这可以让您获得代理效果。