【问题标题】:Factory function for mypy `TypedDict`mypy `TypedDict` 的工厂函数
【发布时间】:2018-10-10 19:27:04
【问题描述】:

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

像使用 TypedDictdict 作为 bound 值这样的事情不起作用,这根本不可能(还)还是我错过了其他东西?

【问题讨论】:

    标签: python python-3.x mypy


    【解决方案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'
    

    在这种情况下不需要绑定。

    【讨论】:

    • 抱歉,我使用的是TypeVar,这只是一个错字。对于那个很抱歉。不使用基数的问题是任何值都可以传递给check_typeddict,而不仅仅是TypedDict。似乎绑定到Mapping 有效,但是仍然允许通过dict,我宁愿拒绝。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 2019-04-23
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多