如何在Python中创建自己的“参数化”类型(如’Optional[T]`)?

我想用Python创建自己的参数化类型,用于类型暗示:

类可以被包装:
#这里有魔法
T=TypeVar('T')
断言可以被包装[T]==联合[T,元组[T]]

别管那些做作的例子;我如何实现这一点?我查看了Union和Optional的源代码,但它看起来像是我希望避免的一些相当低级的黑客行为

文档中唯一的建议来自于继承自泛型的映射[KT,VT]的重新实现示例。但是这个例子更多的是关于\uuu getitem\uu方法,而不是关于类本身

如果您只是尝试创建泛型类或函数,请尝试查看mypy-lang.org上关于泛型类型的文档——它相当全面,比标准库类型文档更详细

如果您试图实现您的特定示例,那么值得指出的是,类型别名与typevars一起工作——您可以简单地执行以下操作:

输入import Union、TypeVar、Tuple的


T=TypeVar('T')
MaybeWrapped=Union[T,Tuple[T]]
def foo(x:int)——>可包装[str]:
如果x%2==0:
返回“嗨”
其他:
返回(“再见”)
#运行mypy时,此行的输出为:
#test.py:13:错误:显示的类型是“Union[builtins.str,Tuple[builtins.str]”
露缝_型(foo(3))

然而,如果您试图构造一个具有真正新语义的泛型类型,那么很可能是运气不好。您剩下的选择是:

  1. 构造某种定制类/元类,PEP 484兼容类型检查器可以理解并使用它
  2. 以某种方式修改您正在使用的类型检查器(例如,mypy有一个实验性的“插件”系统)
  3. 请求修改PEP 484以包含新的自定义类型(您可以通过在键入模块repo中打开一个问题来实现)

发表评论