我希望能够编写一个函数来检查字典是否对我的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
作为 {'Result': {
'j': {'confirmed': true, 'version': '1'},
'z': {'confirmed': false, 'version': '2'},
'y': {'confirmed': true, 'version': '3'}
},
'D': 'null'
}
值之类的方法是行不通的,这是不可能的吗?还是我想念其他东西?
答案 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'
在这种情况下,没有限制。