Python中的JSON对象类型提示

brccelvz  于 2023-08-08  发布在  Python
关注(0)|答案(1)|浏览(123)

我想用一个未知的或不断变化的结构(从外部API拉入)类型提示JSON对象。我想尽可能避免使用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”[call-overload]
可能的过载变体:defgetitem(self,SupportsIndex,/)-> Json defgetitem(self,slice,/)-> list[Json]
类型“dict[str,Json]”的值|列表[Json]|弦|整数|浮漂|布尔|None”不可索引[index]

提问

我做错了什么?我已经设法找到了这个GitHub问题,它可能包含解决方案,但如果是这样,我还没有足够好的类型来看到它。
谢谢你,谢谢

svmlkihl

svmlkihl1#

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

相关问题