Фабричная функция для mypy `TypedDict` - PullRequest
0 голосов
/ 10 октября 2018

Я хочу иметь возможность написать функцию, которая проверяет, подтвержден ли словарь для моего TypedDict, однако я не могу правильно определить универсальный тип.Таким образом, результирующая функция должна выглядеть примерно так:

T = typing.Generic('T', bound=...) # This is `bound=...` something I want to find out

def check_typeddict(value: dict, to_type: typing.Type[T]) -> T:
    # do some type checking
    return typing.cast(T, value)

check_type(MyTypedDict, {'a': 5})

Такие вещи, как использование TypedDict или dict для значения bound, не работают, это просто невозможно (пока) или яЯ что-то пропустил?

1 Ответ

0 голосов
/ 11 октября 2018

Вы не должны использовать Generic - вместо этого вы хотите TypeVar.Мы используем Generic, чтобы объявить, что некоторый класс должен рассматриваться как универсальный;мы используем TypeVar для создания переменной типа (которую мы затем можем использовать для создания универсальных классов или функций).

Вы также поменяли местами аргументы в своем вызове check_type (который также, вероятно, долженbe check_typeddict).

Собрав все это вместе, работающая версия вашего кода выглядит следующим образом:

from typing import TypeVar, Type, cast
from mypy_extensions import TypedDict

class MyTypedDict(TypedDict):
    a: int
    b: int

T = TypeVar('T')

def check_typeddict(value: dict, to_type: Type[T]) -> T:
    # do some type checking
    return cast(T, value)

out = check_typeddict({'a': 5}, MyTypedDict)
reveal_type(out)  # Mypy reports 'MyTypedDict'

В этом случае никаких ограничений не требуется.

...