我想输入提示具有未知或变化结构的 JSON 对象(从外部 API 拉入)。我想尽可能避免使用
Any
或类似 cast()
的解决方案。
我相信正确的提示是:
Json: TypeAlias = dict[str, "Json"] | list["Json"] | str | int | float | bool | None
我发现这个提示常常不起作用。以下代码示例重现了该问题。
import requests
from typing_extensions import TypeAlias
Json: TypeAlias = dict[str, "Json"] | list["Json"] | str | int | float | bool | None
res: requests.models.Response = requests.get(
"https://randomuser.me/api/?results=5&nat=gb"
)
data: Json = res.json()
results: Json = data["results"]
在
data["results:]
我收到 mypy 的以下投诉:
“list”的“getitem”没有重载变体与参数类型“str”匹配[调用重载]
可能的过载变体: def getitem(self, SupportsIndex, /) -> Json def getitem(self, slice, /) -> 列表[Json]
“dict[str, Json] | list[Json] | str | int | float | bool | None”类型的值不可索引 [index]
我做错了什么?我已经设法找到了this GitHub issues,它很可能包含解决方案,但如果是这样,我还不够了解类型来查看它。
谢谢!
任何
str
都是 Json
的有效实例。因此,当您索引一个 Json
对象时,如 data["results"]
中所示,mypy
会抱怨这不是对字符串的有效操作。您可能想要data: dict[str, Json] = res.json()
。或者更好的是,指定文档的整个结构的 TypedDict
。