如何使通用代理类型与静态类型检查器一起工作
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,但它确实 允许您创建现有具体类型的不同子类,这可以让您获得代理效果。
我正在编写一个 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,但它确实 允许您创建现有具体类型的不同子类,这可以让您获得代理效果。