为什么Mypy无法使用MyPy对这样的变量进行注释,为什么Mypy抱怨它要求对列表理解变量进行类型注释?
具体地说,我该如何解决以下错误:
from enum import EnumMeta
def spam( y: EnumMeta ):
return [[x.value] for x in y] ? Mypy: Need type annotation for 'x'
cast
不起作用 :
return [[cast(Enum, x).value] for x in y] ? Mypy: Need type annotation for 'x'
尽管Mypy不支持注释(x:Enum
),但我发现可以使用cast
来注释变量的用法({{3} })。但是,cast(Enum, x)
并没有阻止Mypy抱怨该变量没有首先注释。
#type:
不起作用 :
return [[x.value] for x in y] # type: Enum ? Mypy: Misplaced type annotation
我还看到,可以使用注释for
(see this post)注释 # type:
循环变量。但是,# type: Enum
不适用于列表推导的for
。
答案 0 :(得分:4)
在列表理解中,必须强制转换迭代器而不是元素。
from typing import Iterable, cast
from enum import EnumMeta, Enum
def spam(y: EnumMeta):
return [[x.value] for x in cast(Iterable[Enum], y)]
这也允许mypy
推断x
的类型。此外,在运行时,它仅执行1次强制转换,而不执行n次强制转换。
如果spam
可以消化生成枚举的任何可迭代对象,则更容易直接键入提示。
from typing import Iterable
from enum import Enum
def spam(y: Iterable[Enum]):
return [[x.value] for x in y]