我正在尝试实现当前项目中的类型注释,并且正在接收来自mypy的错误,而我不理解这些错误。
我正在使用Python2.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"
以上类型出现在台风中.mypy 文档说:"Mypy合并了类型化的项目,其中包含了用于Python和标准库的库存根。“不知道什么是“合并”的意思-我需要做些什么来“激活”,或提供一个路径,键入?我是否需要下载和安装(?)在本地打的?
发布于 2016-08-08 14:56:13
问题是,types.StringTypes
被定义为类型序列--形式类型签名论台风是:
StringTypes = (StringType, UnicodeType)
这对应于正式文件,它声明StringTypes
常数是“包含StringType
和UnicodeType
的序列”。
因此,这解释了您所得到的错误-- StringTypes
不是一个实际的类(可能是一个元组),所以mypy不承认它是一个有效的类型。
对此有几种可能的解决办法。
第一种方法可能是使用typing.AnyStr
,它被定义为AnyStr = TypeVar('AnyStr', bytes, unicode)
。尽管AnyStr
包含在typing
模块中,但不幸的是,到目前为止,它的文档还不多--您可以找到关于它做什么的更详细的信息( 在电子文档中 )。
一种稍微不那么清晰的表达方式是:
from types import StringType, UnicodeType
from typing import Union
MyStringTypes = Union[StringType, UnicodeType]
def f(value):
# type: (MyStringTypes) -> MyStringTypes
return value
这也有效,但不太理想,因为返回类型不再有义务与输入类型相同,在处理不同类型的字符串时,输入类型通常不是您想要的。
至于类型--在安装mypy时,默认情况下是绑定的。在理想的世界中,您根本不需要担心类型划分,但是由于mypy处于beta版,所以类型经常被更新,以说明缺少的模块或不正确的类型注释,如果您发现自己经常遇到带有类型类型的错误,那么直接从Github回购安装mypy和安装本地类型的类型可能是值得的。
https://stackoverflow.com/questions/38836357
复制