微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Typehint 函数,它采用混合类型字典并返回带有 mypy 的混合类型字典

如何解决Typehint 函数,它采用混合类型字典并返回带有 mypy 的混合类型字典

我想知道如何输入提示

def f(d,n):
    return {(n,key): d[key] for key in d}

dd = {
    1.0: 10.2,2.0: 11.8,"T1": 300,"T2": 300,}
nn = "Name"


f(d = dd,n = nn)
# returns:
# {('Name',1.0): 10.2,# ('Name',2.0): 11.8,'T1'): 300,'T2'): 300}

我尝试了以下方法


def f(
    d : Mapping[Union[str,float],n : str) -> Dict[Tuple[str,float]:
    return {(n,n = nn)

给出错误

main.py:6: error: Key expression in dictionary comprehension has incompatible type "Tuple[str,Union[str,float]]"; expected type "Tuple[str,float]"
main.py:17: error: Argument "d" to "f" has incompatible type "Dict[object,float]"; expected "Mapping[Union[str,float]"
Found 2 errors in 1 file (checked 1 source file)

我不知道如何解决这个问题。

解决方法

我建议以不同的方式解决问题。与其尝试指定特定类型,因为您的函数并不真正依赖键是字符串或浮点数,不如像这样使其通用:

T1 = TypeVar("T1")
T2 = TypeVar("T2")
T3 = TypeVar("T3")

def f(d: Mapping[T1,T2],n: T3) -> Dict[Tuple[T3,T1],T2]:
    return {(n,key): d[key] for key in d}

这通过了 mypy 检查:

Success: no issues found in 1 source file

现在变得更容易理解了,因为您不再推断什么应该是 Union,什么不应该。如果 mypy 看到 T1 需要是特定情况下的 Union,它会自行推断。

但要回答您的实际问题:

main.py:6: error: Key expression in dictionary comprehension has incompatible type "Tuple[str,Union[str,float]]"; expected type "Tuple[str,float]"

此错误发生在您的代码中,因为您的元组的第二个元素(键)是 float,而输入键是 Union[str,float]。您试图将潜在的 str 强制转换为 float

main.py:17: error: Argument "d" to "f" has incompatible type "Dict[object,float]"; expected "Mapping[Union[str,float],float]"

这是上述错误的扩展,展示了当元组的第二个元素的类型改变时整个返回类型如何改变。解决您的问题将消除这两个问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。