mypy"无效类型"错误

时间:2016-08-08 18:44:05

标签: python mypy

我正在尝试在当前项目中实现类型注释,并且我收到mypy的错误,我不明白。

我使用的是Python 2.7.11,并在我的基础virtualenv中新安装了mypy。以下程序运行良好:

from __future__ import print_function
from types import StringTypes
from typing import List, Union, Callable

def f(value):     # type: (StringTypes) -> StringTypes
    return value

if __name__ == '__main__':
    print("{}".format(f('some text')))
    print("{}".format(f(u'some unicode text')))

但是运行mypy --py2 -s mypy_issue.py会返回以下内容:

mypy_issue.py: note: In function "f":
mypy_issue.py:8: error: Invalid type "types.StringTypes"

以上类型似乎位于Typeshed ... mypy documentation说" Mypy合并了类型化项目,其中包含Python内置程序和标准库的库存根。 " ...不确定"合并"意味着 - 我是否需要做一些事情来激活"或提供一个路径,类型?我是否需要在本地下载并安装(?)Typeshed?

1 个答案:

答案 0 :(得分:3)

问题是types.StringTypes被定义为类型的序列 - 正式类型签名on Typeshed是:

StringTypes = (StringType, UnicodeType)

这对应于official documentation,其中指出StringTypes常量是&#34;包含StringTypeUnicodeType&#34; ... <的序列/ p>

那么,这就解释了你得到的错误 - StringTypes不是一个真实的课程(它可能是一个元组),因此mypy无法识别它是一种有效的类型。

对此有几种可能的解决方法。

第一种方法可能是使用定义为typing.AnyStr的{​​{1}}。尽管AnyStr = TypeVar('AnyStr', bytes, unicode)模块中包含了AnyStr,但遗憾的是,截至目前,它的文档记录较少 - 您可以找到有关其内容的更详细信息within the mypy docs

这样做的表达方式略逊一筹:

typing

这也有效,但不太理想,因为返回类型不再与输入类型相同,在使用不同类型的字符串时通常不是你想要的。

至于typeshed - 在安装mypy时默认捆绑了它。在一个理想的世界中,你根本不需要担心打字,但由于mypy处于测试阶段,因此经常更新类型以解决缺少的模块或不正确的类型注释,因此可能需要直接安装mypy。 Github repo并在本地安装类型,如果您发现自己经常遇到带有类型的错误。