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

发布于 2021-01-29 15:58:11

我想在Python中创建自己的参数化类型以用于类型提示:

class MaybeWrapped:
    # magic goes here

T = TypeVar('T')

assert MaybeWrapped[T] == Union[T, Tuple[T]]

不用管这个人为的例子。我该如何实施?我查看了Union和Optional的来源,但看起来我想避免一些相当底层的黑客。

文档中的唯一建议来自继承自Generic示例的重新实现Mapping[KT,VT]。但是那个例子更多的是关于__getitem__方法的,而不是关于类本身的。

关注者
0
被浏览
150
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如果您只是尝试创建泛型类或函数,请尝试查看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))
    

    但是,如果您试图用一种全新的语义来构造一个泛型类型,那么您很可能会走运。您剩余的选择是:

    1. 构造某种自定义类/元类的东西,符合PEP 484的类型检查器 可以 理解和使用。
    2. 修改您以某种方式使用的类型检查器(例如,mypy具有实验性的“插件”系统)
    3. 请修改PEP 484以包括您的新的自定义类型(您可以通过在键入模块repo中打开问题来完成此操作)。


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看