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

时间:2018-05-13 15:30:16

标签: python-3.6 type-hinting typing

我正在编写一个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 个答案:

答案 0 :(得分:1)

据我所知,没有符合PEP 484标准的方法。

但是,如果你专门使用mypy,可能会编写一个插件来支持这个用例。唯一的缺点是插件系统仍然是非常新的并且不断变化,因此故意记录很少 - 如果你想尝试使用它,你应该准备好进行一些挖掘。

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

from typing import NewType

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

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