mypy: определить типы для определенных ключей в динамическом словаре - PullRequest
1 голос
/ 20 июня 2019

У меня есть следующий словарь, представляющий человека, который может быть одним из многих вариантов.Вот лишь некоторые из них:

person = {"name": "Johnny"}
person = {"name": "Johnny", "age": 25}
person = {"name": "Johnny", "age": 25, "active": True}

Я извлекаю определенные ключи и использую их для печати выписки.Проблема возникает в подсказках типа, где я получаю сообщение об ошибке 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")

Чтобы решить эту проблему, тип 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}

Есть ли способ определить типы для определенных ключей в словаре, даже если ключи в этом словаре являются динамическими?

1 Ответ

1 голос
/ 29 июня 2019

Добавление total=False к вашему TypedDict позволит пропустить ключи:

PersonDict = TypedDict("PersonDict", {"name": str, "age": int}, total=False)

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

Разрешение дополнительных ключей, не входящих в схему, представляется невозможным.

...