为什么Mypy无法注释列表时会抱怨列表理解?

时间:2020-03-13 11:51:01

标签: python mypy python-typing

为什么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

我还看到,可以使用注释forsee this post)注释 # type: 循环变量。但是,# type: Enum不适用于列表推导的for

1 个答案:

答案 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]