>> import typing >>> from yarl import URL >>> StrO-6ren">
gpt4 book ai didi

python - 绕过 "typing.Union is not a generic class"

转载 作者:太空宇宙 更新时间:2023-11-04 04:23:05 30 4
gpt4 key购买 nike

在 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 定义的,都会出现这种情况。 (至少在 Python 3.7 中。)

看起来有一种方法可以将 Generic 子类化,大概是这样的:

class SetOrDict(typing.Generic[StrOrURL]):
# ...

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

有没有办法适应上述情况?即,下标用户定义(非通用)typedef 的推荐做法是什么?

最佳答案

您不能使用 Union[...]、别名或其他方式作为通用类型,不。您的 union contents 也不是通用的,您无法使用 dict< 说明 dictset 对象可以包含哪些类型set 直接,你会使用 SetDict .

你有一个新工会:

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

请注意,字典有键和值,您需要提供这两者的信息。如果这用作 API 的输入,则考虑使用更通用和不可变的 AbstractSetMapping 类型;这清楚表明您的 API 只需要读取信息。

就我个人而言,我会认真考虑重构一个代码库,该代码库对于它可以接受的对象种类如此困惑。要求 API 只接受集合并且现有代码必须传入 set(dictionary) 而不是 dictionary 并不是一个艰巨的要求,或者 API 可能真的可以与任何StrOrUrl可迭代

关于python - 绕过 "typing.Union is not a generic class",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54094105/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com