四处走动”打字。联合不是泛型类“

2024-06-16 10:24:02 发布

您现在位置:Python中文网/ 问答频道 /正文

在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子类化,大概如下所示:

^{pr2}$

但这将立即引发TypeError: Parameters to Generic[...] must all be type variables。在

有没有办法适应上述情况?一、 例如,订阅用户定义(非泛型)typedef的推荐做法是什么?在


Tags: importurltyping定义isdictgenericlist
1条回答
网友
1楼 · 发布于 2024-06-16 10:24:02

您不能使用Union[...],别名或其他,作为泛型类型,不。您的联合内容也不是泛型的,您不能直接使用dict或{}来声明dict或{}对象可以包含哪些类型,可以直接使用^{}或{a2}。在

你有了一个新的工会:

URLorStrSetOrDict = typing.Union[Set[StrOrUrl], Dict[StrOrUrl, Any]]

注意,字典中有键和值,您需要提供这两者的信息。如果将其用作API的输入,那么考虑使用更通用和不可变的AbstractSet和{}类型;这清楚地表明,您的API只需要读取信息。在

就我个人而言,我会认真考虑重构一个代码库,这个代码库对于它可以接受的对象种类非常模糊。要求API只接受集合,而现有代码必须传入set(dictionary),而不是{},这并不是一个艰巨的要求,或者API真的可以处理StrOrUrl的任何iterable。在

相关问题 更多 >