我的"invalid type"错误



我试图在当前项目中实现类型注释,并且从我不理解的mymyy接收错误。

我使用Python 2.7.11,并在我的基本虚拟环境中新安装了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"

上述类型似乎在typehed…mypy文档中说:"mypy合并了类型化的项目,其中包含Python内置库和标准库的库存根。"…不确定"合并"是什么意思-我需要做些什么来"激活",或者提供一个路径,Typeshed?我是否需要下载和安装(?)Typeshed本地?

问题是types.StringTypes被定义为类型的序列——typehed上的正式类型签名是:

StringTypes = (StringType, UnicodeType)

这对应于官方文档,其中指出StringTypes常数是"包含StringTypeUnicodeType的序列"…

那么,这就解释了你得到的错误——StringTypes不是一个实际的类(它可能是一个元组),所以mypy不能将其识别为有效类型。

有几种可能的修复方法。

第一种方法可能是使用typing.AnyStr,它被定义为AnyStr = TypeVar('AnyStr', bytes, unicode)。虽然AnyStr包含在typing模块中,但不幸的是,到目前为止,它的文档记录很少——您可以在mypy文档中找到有关其功能的更详细信息。

一种稍微不那么简洁的表达方式是:

from types import StringType, UnicodeType
from typing import Union
MyStringTypes = Union[StringType, UnicodeType]
def f(value):     
    # type: (MyStringTypes) -> MyStringTypes
    return value

这也可以,但不太理想,因为返回类型不再必须与输入类型相同,而在处理不同类型的字符串时,这通常不是您想要的。

至于typeshed——当你安装mypy时,它是默认绑定的。在理想的情况下,你根本不需要担心typeshed,但由于mypy还处于测试阶段,所以typeshed会经常更新,以弥补缺失的模块或不正确的类型注释,如果你发现自己经常遇到typeshed的错误,那么直接从Github repo安装mypy并在本地安装typeshed可能是值得的。

相关内容

  • 没有找到相关文章

最新更新