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