代码之家  ›  专栏  ›  技术社区  ›  fleetingbytes

嵌套dict的类型提示

  •  0
  • fleetingbytes  · 技术社区  · 6 年前

    json.load(file_handle) 类型,是 <class 'dict'> . 到现在为止,一直都还不错。现在对于一个使用它作为输入参数的函数,我需要解析后的json的类型提示。我在 typing documentation dict 作为论点,我应该用 Mapping[key_type, value_type]

    from typing import Mapping
    
    def foo(json_data: Mapping[str, str]) -> None:
        ...
    

    我解析的json str -键入键和 结构 迪克特 具有 结构 钥匙之类的 s作为值。它是非常嵌套的,直到最后一个dict最终 结构 价值观。

    那么如何更精确地表示这种数据结构呢?我在想一些事情 this question

    Union[Mapping[str, str], Mapping[str, Mapping]]
    

    但它似乎只代表一个层次的递归。有没有更好的方式来输入hint this?

    0 回复  |  直到 5 年前
        1
  •  2
  •   vivax    5 年前

    简单的口述

    你可以简单地使用 Mapping[K, V] Mapping . 假设您的json如下所示:

    {
       "person_1": {"money": 1000},
       "person_2": {"money": 1000}
    }
    

    在这种情况下,可以使用如下类型的提示:

    Mapping[str, Mapping[str, int]]
    

    难听的话

    {
        "person_1": {
            "money": 1000,
            "job": "coder",
        }
    }
    

    那你怎么能输入提示呢?你可以用 Union typing

    Mapping[str, Mapping[str, Union[str, int]]]
    

    但是现在我们遇到了一个问题,像mypy这样的工具 our_dict["person_1"]["job"] 具有类型 Union[str, int]

    TypedDict (link to pep explaining it) 从[键入扩展名]( https://pypi.org/project/typing-extensions/ .

    from typing_extensions import TypedDict
    
    class Person(TypedDict):
        money: int
        job: str
    
    # type hint you would use in your function:
    Mapping[str, Person]
    

    注: 在python中 3.8 TypedDict typing