使用mypy检查类型时出了什么问题

时间:2017-12-01 08:34:26

标签: annotations python-3.5 type-hinting mypy

from typing import Dict, List, Any, AnyStr, TypeVar
def abc(xyz: str) -> Dict[AnyStr, Any]:
    return {"abc": 1}

我使用mypy来检查这个文件。它给出了一个错误。

以下是错误消息

  

" Dict条目0具有不兼容的类型" str":" int&#34 ;;预期"字节":   "任何""

但我不知道为什么

1 个答案:

答案 0 :(得分:0)

问题是AnyStr实际上是typevar的别名。这意味着您的程序实际上完全等同于编写:

from typing import Dict, Any, AnyStr, TypeVar

T = TypeVar('T', str, bytes)

def abc(xyz: str) -> Dict[T, Any]:
    return {"abc": 1}

然而,这给我们带来了一个问题:mypy如何推断你想要T的两种可能的替代方案中的哪一种?

有三种可能的修复方法。你可以......

  1. 在类型签名中找到至少两次或多次使用AnyStr的方法。例如,也许您认为这更符合您的意思?

    def abc(xyz: AnyStr) -> Dict[AnyStr, Any]:
        # etc
    
  2. 使用Union[str, bytes]代替AnyStr

    from typing import Union, Dict, Any
    
    def abc(xyz: str) -> Dict[Union[str, bytes], Any]:
        # etc
    

    如果类型签名开始变得令人不舒服,您可以使用类型别名缩短它:

    from typing import Union, Dict, Any
    
    # Note: this isn't a great type alias name, but whatever
    UnionStr = Union[str, bytes]
    
    def abc(xyz: str) -> Dict[UnionStr, Any]:
        # etc