在Python的typing
模块中,似乎任何非generic类型的内容都不支持订阅:
>>> import typing
>>> from yarl import URL
>>> StrOrURL = typing.Union[URL, str]
>>> typing.List[StrOrURL] # OK; List is generic
typing.List[typing.Union[yarl.URL, str]]
>>> SetOrDict = typing.Union[set, dict]
>>> SetOrDict[StrOrURL] # Raises
TypeError: typing.Union[set, dict] is not a generic class
无论SetOrDict
是用typing.Union
还是typing.TypeVar
来定义,都是这样的情况。(至少在Python3.7中)
似乎有一种方法可以将Generic
子类化,大概如下所示:
但这将立即引发TypeError: Parameters to Generic[...] must all be type variables
。在
有没有办法适应上述情况?一、 例如,订阅用户定义(非泛型)typedef的推荐做法是什么?在
您不能使用}来声明}对象可以包含哪些类型,可以直接使用^{} 或{a2}。在
Union[...]
,别名或其他,作为泛型类型,不。您的联合内容也不是泛型的,您不能直接使用dict
或{dict
或{你有了一个新的工会:
注意,字典中有键和值,您需要提供这两者的信息。如果将其用作API的输入,那么考虑使用更通用和不可变的}类型;这清楚地表明,您的API只需要读取信息。在
AbstractSet
和{就我个人而言,我会认真考虑重构一个代码库,这个代码库对于它可以接受的对象种类非常模糊。要求API只接受集合,而现有代码必须传入},这并不是一个艰巨的要求,或者API真的可以处理
set(dictionary)
,而不是{StrOrUrl
的任何iterable。在相关问题 更多 >
编程相关推荐