我正在编写一个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}')
是否有办法将其变成某种代理类型?
答案 0 :(得分:1)
据我所知,没有符合PEP 484标准的方法。
但是,如果你专门使用mypy,可能会编写一个插件来支持这个用例。唯一的缺点是插件系统仍然是非常新的并且不断变化,因此故意记录很少 - 如果你想尝试使用它,你应该准备好进行一些挖掘。
但是,如果您想要应用您的'唯一','索引'和'主要'对于只有固定数量类型的约束,您可以使用NewType,如下所示:
from typing import NewType
UniqueInt = NewType('UniqueInt', int)
UniqueStr = NewType('UniqueStr', str)
# etc...
这有点hacky,但它 允许您创建现有具体类型的不同子类,这可以让您获得代理效果。