让Mypy接受解压缩的字典

时间:2017-12-04 11:16:57

标签: python dictionary mypy

我遇到mypy问题

我的代码如下:

func(arg1, arg2, arg3=0.0, arg4=0.0)
# type: (float, float, float, float) -> float
# do something and return float.

dict_with_other_arguments = {arg3: 0.5, arg4: 1.4}
a = func(arg1, arg2, **dict_with_other_arguments)

问题是mypy没有检查字典中的类型是什么,而是我得到如下错误: 错误:参数3到" func"具有不兼容的类型" ** Dict [str,float]&#34 ;;预期"浮动"

任何想法如何在不更改代码的情况下解决此问题?

1 个答案:

答案 0 :(得分:3)

Mypy在标记函数调用时是正确的。以下代码说明了原因:

def func(str_arg='x', float_arg=3.0):
  # type: (str, float) -> None
  print(str_arg, float_arg)

kwargs1 = {'float_arg': 8.0}
kwargs2 = {'str_arg': 13.0}  # whoops

func(float_arg=5.0)  # prints "x 5.0" -- good
func(**kwargs1)      # prints "x 13.0" -- good but flagged by Mypy
func(**kwargs2)      # prints "13.0 3.0" -- bad

在此示例中,kwargs1kwargs2均为Dict[str, float]类型。类型检查器不考虑键的内容,仅考虑键的类型,因此对func的第二次和第三次调用看起来与Mypy相同。它们要么必须都是错误,要么都必须是可接受的,并且都不能都是可接受的,因为第三个调用违反了类型系统。

类型检查器可以确保未在dict中传递错误类型的唯一方法是,是否所有未明确传递的参数都共享dict值的类型。但是请注意,mypy不会保护您免受因在dict中重新指定关键字参数而导致的错误:

# This works fine:
func('x', **kwargs1)
# This is technically type safe and accepted by mypy, but at runtime raises
# `TypeError: func() got multiple values for argument 'str_arg'`:
func('x', **kwargs2)

这里有关于此问题的进一步讨论:https://github.com/python/mypy/issues/1969