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

Posted

技术标签:

【中文标题】如何使泛型代理类型与静态类型检查器一起使用【英文标题】:How to make generic proxy types work with static type checkers 【发布时间】:2018-10-23 08:54:16 【问题描述】:

我正在编写一个 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')

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

【问题讨论】:

我喜欢一些允许通用代理的机制。不幸的是,建议的解决方案还不够。 【参考方案1】:

据我所知,没有符合 PEP 484 的方法来执行此操作。

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

但是,如果您只想将“唯一”、“索引”和“主要”约束应用于固定数量的类型,则可以使用 NewType,如下所示:

from typing import NewType

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

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

【讨论】:

以上是关于如何使泛型代理类型与静态类型检查器一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Simple JavaJava中静态类型检查是如何进行的

如何使用具有泛型类型的静态属性并有意义?

Java中静态类型检查是如何进行的

回归泛型类型推断

Java泛型方法

软件构造课程提纲