Python 中提示 JSON 对象的类型

问题描述 投票:0回答:1

我想输入提示具有未知或变化结构的 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,它很可能包含解决方案,但如果是这样,我还不够了解类型来查看它。

谢谢!

python json types mypy python-typing
1个回答
0
投票

任何

str
都是
Json
的有效实例。因此,当您索引一个
Json
对象时,如
data["results"]
中所示,
mypy
会抱怨这不是对字符串的有效操作。您可能想要
data: dict[str, Json] = res.json()
。或者更好的是,指定文档的整个结构的
TypedDict

© www.soinside.com 2019 - 2024. All rights reserved.