Почему этот код генерирует предупреждение об аннотации типа?

У меня есть функции Python с этими аннотациями типа

def func_1() -> Optional[Sequence[str, List[str], str]]:
    # do stuff

def func_2(a: str, b: List[str], c: str) -> None:
    # do other stuff

Почему следующий код дает мне предупреждение Список ожидаемых типов [str, Any] ' получил 'str' вместо строки, в которой я вызываю func_2?

result = func_1()
func_2(result[0], result[1], result[2])

Означает ли это, что с моей проверкой типов что-то не так, или это проблема с моим кодом?


person J. Grohmann    schedule 15.03.2021    source источник
comment
Я получаю гораздо больше ошибок, включая синтаксическую ошибку. Пожалуйста, проверьте еще раз, что это минимально воспроизводимый пример.   -  person jonrsharpe    schedule 15.03.2021
comment
Это: List[str, ...] не является допустимой аннотацией, насколько мне известно... то же самое с Sequence[str, List[str, ...] str].... что вы пытаетесь там выразить?   -  person juanpa.arrivillaga    schedule 15.03.2021
comment
Опубликуйте предупреждение дословно и укажите значение result. Скорее всего, result[1] — это str, а не list, но это неясно из того, что вы предоставили.   -  person Michael Ruth    schedule 15.03.2021
comment
Код был предоставлен только для того, чтобы показать аннотации двух типов, которые я использовал. Конечно, реализация функции и импорт отсутствуют, но если func_1 гарантированно возвращает аннотированный тип (поскольку в этой аннотации нет предупреждения), то как result[1] может быть строкой, а не List[str, . ..]? Согласно PEP 484 List[str, ...] — это аннотация, которая будет использоваться для списков строк неопределенной длины. Я предоставил дословное предупреждение, данное PyCharm. Речь идет не о конкретном исполнении, а о предупреждении типа, поэтому результат не имеет значения.   -  person J. Grohmann    schedule 15.03.2021
comment
@J.Grohmann В соответствии с PEP 484 List[str, ...] - это аннотация, которую следует использовать для списков строк неопределенной длины. Нет, это абсолютно не так. Так работает typing.Tuple, а не typing.List, который не содержит никакой информации об ожидаемой длине.   -  person juanpa.arrivillaga    schedule 15.03.2021
comment
Кроме того, Sequence[str, List[str, ...], str] что это должно означать?   -  person juanpa.arrivillaga    schedule 15.03.2021
comment
Я удалил многоточие, так как это никак не влияет на предупреждение. Я не уверен, что вы спрашиваете со своим вторым комментарием. Это аннотация типа для последовательности с тремя элементами типов str, List и str соответственно, не так ли?   -  person J. Grohmann    schedule 15.03.2021
comment
@ Дж. Грохманн нет. Это неправильно. Sequence, как и List, принимает переменную одного типа.   -  person juanpa.arrivillaga    schedule 16.03.2021


Ответы (1)


Sequence не предназначен для использования с несколькими типами, подобными этому. Sequence и List не должны иметь структуру (это означает, что элемент 1 всегда int, элемент 2 всегда str и всегда ровно 2).

Вместо этого вы должны использовать Tuple.

Также см.: https://stackoverflow.com/a/40181387/4597523

person Faboor    schedule 15.03.2021