gpt4 book ai didi

python - 如何向 UserDict 提供类型提示?

转载 作者:行者123 更新时间:2023-12-03 08:05:43 25 4
gpt4 key购买 nike

我想定义一个 UserDict 来从 JSON 读取值并存储给定键的位置。 JSON 文件如下所示:

{
"pages": [
{
"areas": [
{
"name": "My_Name",
"x": 179.95495495495493,
"y": 117.92792792792793,
"height": 15.315315315315303,
"width": 125.58558558558553
},
...
]
}
]
}

我想向类型 linter(例如 MyPy)表明该字典作为键是字符串,值是 Position

我当前的代码如下:

import json
from collections import UserDict
from dataclasses import dataclass, field
from pathlib import Path
from typing import Dict, List, Optional, Union

from typing_extensions import Literal


JsonPosition = Dict[str, Union[str, float]]
JsonPage = Optional[Dict[Literal["areas"], List[JsonPosition]]]


@dataclass
class Position:
"""Information for a position"""

name: str
x: float
y: float
width: float
height: float

@classmethod
def from_json(cls, dict_values: JsonPosition):
return cls(**dict_values) # type: ignore # dynamic typing


class Page(UserDict):
"""Information about positions on a page"""

@classmethod
def from_json(cls, page: JsonPage):
"""Get positions from JSON Dictionary"""
if page is None:
return cls()

return cls({cast(str, p["name"]): Position.from_json(p) for p in page["areas"]})



JSON = Path("my_positions.json").read_text()
positions = json.loads(JSON)
page_1 = Page.from_json(positions["pages"][0])

我希望 MyPy(或 Pylance 或我使用的任何类型提示)自动将 page_1["My_Name"] 识别为 Position

我可以改变什么?

最佳答案

实际上,您可以直接使用方括号 ([...]) 向 UserDict 提供类型,就像使用 Dict 一样:

class Page(UserDict[str, Position]):
...

对于Python 3.6或更早版本,这不起作用。

对于 Python >=3.7 和 <3.9,您需要 the followingcollections.UserDict 添加下标并将其放入特定于类型检查的单独 block 中(使用常量 TYPE_CHECKING):

from __future__ import annotations
from collections import UserDict
from typing import TYPE_CHECKING

if TYPE_CHECKING:
TypedUserDict = UserDict[str, Position]
else:
TypedUserDict = UserDict


class Page(TypedUserDict):
...

对于Python 3.9+,不需要额外的导入或技巧。

关于python - 如何向 UserDict 提供类型提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72436467/

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