mypy:定义动态字典中特定键的类型

Joh*_*etz 4 python python-3.x mypy

我有以下字典,代表一个人,可能是许多变体之一。这里仅仅是少数:

person = {"name": "Johnny"}
person = {"name": "Johnny", "age": 25}
person = {"name": "Johnny", "age": 25, "active": True}
Run Code Online (Sandbox Code Playgroud)

我正在提取某些键并使用它们来打印语句。Incompatible types in assignment (expression has type "object", variable has type "Optional[str]")问题出现在类型提示中,当我在脚本上运行 mypy 时出现错误:

name: Optional[str] = person.get("name")  # mypy error here
age: Optional[int] = person.get("age")    # mypy error here
if name and age:
    print(f"In 5 years, {name} will be {age + 5} years old")
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,该mypy_extensions.TypedDict类型似乎很有前途,但看来我不能缺少或多余的键:

from mypy_extensions import TypedDict
PersonDict = TypedDict("PersonDict", {"name": str, "age": int})

# ERROR: Key 'age' missing for TypedDict "PersonDict"
person: PersonDict = {"name": "Johnny"}

# ERROR: Extra key 'active' for TypedDict "PersonDict"
person: PersonDict = {"name": "Johnny", "age": 25, "active": True}
Run Code Online (Sandbox Code Playgroud)

即使字典中的键是动态的,是否仍然可以为字典中的特定键定义类型?

Mar*_*zer 6

添加total=False到您的 TypedDict 将允许丢失键:

PersonDict = TypedDict("PersonDict", {"name": str, "age": int}, total=False)
Run Code Online (Sandbox Code Playgroud)

https://mypy.readthedocs.io/en/latest/more_types.html#totality

允许架构中没有的附加键似乎是不可能的。