我正在尝试在当前项目中实现类型注释,并且我收到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?
答案 0 :(得分:3)
问题是types.StringTypes
被定义为类型的序列 - 正式类型签名on Typeshed是:
StringTypes = (StringType, UnicodeType)
这对应于official documentation,其中指出StringTypes
常量是"包含StringType
和UnicodeType
&#34; ... <的序列/ p>
那么,这就解释了你得到的错误 - StringTypes
不是一个真实的课程(它可能是一个元组),因此mypy无法识别它是一种有效的类型。
对此有几种可能的解决方法。
第一种方法可能是使用定义为typing.AnyStr
的{{1}}。尽管AnyStr = TypeVar('AnyStr', bytes, unicode)
模块中包含了AnyStr
,但遗憾的是,截至目前,它的文档记录较少 - 您可以找到有关其内容的更详细信息within the mypy docs。
这样做的表达方式略逊一筹:
typing
这也有效,但不太理想,因为返回类型不再与输入类型相同,在使用不同类型的字符串时通常不是你想要的。
至于typeshed - 在安装mypy时默认捆绑了它。在一个理想的世界中,你根本不需要担心打字,但由于mypy处于测试阶段,因此经常更新类型以解决缺少的模块或不正确的类型注释,因此可能需要直接安装mypy。 Github repo并在本地安装类型,如果您发现自己经常遇到带有类型的错误。