带参数的自定义类型提示

Custom type hint with parameter

时不时地,我发现自己在定义一个函数时,其参数可能是某个类型的单个实例,也可能是同一类型的序列。当类型本身已经很复杂时,类型提示会很快被混淆。

而不是像

my_dicts: Union[Dict[str, int], Sequence[Dict[str, int]]] 

我想定义一个快捷方式,这样我就可以直接输入

my_dicts: SingleOrSequence[Dict[str, int]] 

我该如何以最 pythonic 的方式解决这个问题?还要记住,为了与其他类型保持一致,调用签名应该像上面那样,即指定自定义类型名称并用方括号直接传递包含的类型。

我能想到的最好的看起来像这样:

import typing

class SingleOrSequenceClass():
    @staticmethod
    def __getitem__(typ):
        return typing.Union[typ, typing.Sequence[typ]]
    
SingleOrSequence = SingleOrSequenceClass() 

这确实有效,但特别是必须实例化 SingleOrSequenceClass 并不适合我。关于如何改进这个的任何建议? typing 模块本身是否为此提供了任何优雅的解决方案?

我认为 Generics TypeVar 可能是你的朋友。

from typing import TypeVar

T = TypeVar('T')
SingleOrSequence = Union[T, Sequence[T]]

my_dicts: SingleOrSequence[Dict[str, int]]