mypy`TypedDict`的工厂函数

时间:2018-10-10 19:27:05

标签: python python-3.x mypy

我希望能够编写一个函数来检查字典是否对我的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

使用dictbound作为 {'Result': { 'j': {'confirmed': true, 'version': '1'}, 'z': {'confirmed': false, 'version': '2'}, 'y': {'confirmed': true, 'version': '3'} }, 'D': 'null' } 值之类的方法是行不通的,这是不可能的吗?还是我想念其他东西?

1 个答案:

答案 0 :(得分:1)

您不应该使用Generic,而要使用TypeVar。我们使用Generic声明应将某些类视为泛型;我们使用TypeVar创建一个类型变量(然后可以使用它来帮助创建通用类或函数)。

调用check_type(也可能是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'

在这种情况下,没有限制。