Почему mypy жалуется на понимание списка, когда его нельзя аннотировать? - PullRequest
2 голосов
/ 13 марта 2020

Почему 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 ( см. этот пост ). Тем не менее, cast(Enum, x) не останавливает Mypy, жалуясь на то, что переменная вообще не аннотирована.

#type: не работает :

return [[x.value] for x in y] # type: Enum ? Mypy: Misplaced type annotation

Я также вижу, что переменная for l oop может быть аннотирована с помощью комментария, # type: ( см. Этот пост ). Тем не менее, # type: Enum не работает для for.

1 Ответ

2 голосов
/ 13 марта 2020

В понимании списка итератор должен быть приведен вместо элементов.

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]
...