如何在Python中创建自己的“参数化”类型(如“ Optional [T]”)?
我想在Python中创建自己的参数化类型以用于类型提示:
class MaybeWrapped:
# magic goes here
T = TypeVar('T')
assert MaybeWrapped[T] == Union[T, Tuple[T]]
不用管这个人为的例子。我该如何实施?我查看了Union和Optional的来源,但看起来我想避免一些相当底层的黑客。
文档中的唯一建议来自继承自Generic的示例的重新实现Mapping[KT,VT]
。但是那个例子更多的是关于__getitem__
方法的,而不是关于类本身的。
-
如果您只是尝试创建泛型类或函数,请尝试查看mypy-
lang.org上有关泛型类型的文档-它相当全面,比标准库键入文档更详细。如果您要实现自己的特定示例,则需要指出类型别名可以与typevars一起使用-您可以简单地执行以下操作:
from typing import Union, TypeVar, Tuple T = TypeVar('T') MaybeWrapped = Union[T, Tuple[T]] def foo(x: int) -> MaybeWrapped[str]: if x % 2 == 0: return "hi" else: return ("bye",) # When running mypy, the output of this line is: # test.py:13: error: Revealed type is 'Union[builtins.str, Tuple[builtins.str]]' reveal_type(foo(3))
但是,如果您试图用一种全新的语义来构造一个泛型类型,那么您很可能会走运。您剩余的选择是:
- 构造某种自定义类/元类的东西,符合PEP 484的类型检查器 可以 理解和使用。
- 修改您以某种方式使用的类型检查器(例如,mypy具有实验性的“插件”系统)
- 请修改PEP 484以包括您的新的自定义类型(您可以通过在键入模块repo中打开问题来完成此操作)。