gpt4 book ai didi

python - 结合 mypy Union 和嵌套的 TypedDict 导致 mypy 错误 : incompatible return value

转载 作者:行者123 更新时间:2023-12-04 15:33:39 32 4
gpt4 key购买 nike

我想将 TypedDictUnion 结合起来。这样函数就可以返回 AB。 Mypy 能够直接正确检测 TypedDict 返回类型。但是当 TypedDict 嵌套在 Union 中时,它不起作用。

from typing_extensions import TypedDict
from typing import Union


class A(TypedDict):
a: str


class B(TypedDict):
b: str


def works() -> A:
return {'a': 'value'}
# Works as expected


def problem() -> Union[A, B]:
return {'a': 'value'}
# mypy_error: Incompatible return value type (got "Dict[str, str]", expected "Union[A, B]")
# Reports an error while it should be valid


def workaround() -> Union[A, B]:
x: A = {'a': 'value'}

return x
# This works again but is not very elegant

一个可能的解决方法是分配给临时返回类型提示变量(参见 workaround())。有更优雅的方法吗?

注意:Python 3.7

最佳答案

引自 PEP 589 :

An explicit [TypedDict] type annotation is generally needed, as otherwise an ordinary dictionary type could be assumed by a type checker, for backwards compatibility. When a type checker can infer that a constructed dictionary object should be a TypedDict, an explicit annotation can be omitted.

因此,在您的代码中显式定义类型并没有错。另一种可能性是直接“实例化”A:

def problem() -> Union[A, B]:
return A(a='value')

虽然这当然只是一个语法糖,会在运行时被替换为 dict

关于python - 结合 mypy Union 和嵌套的 TypedDict 导致 mypy 错误 : incompatible return value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60507400/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com