Я пытаюсь использовать mypy для некоторых функций utils в своем проекте, но у меня возникают проблемы с этой функцией, которая объединяет groupby и next.
Это код функции:
from itertools import groupby
from typing import Iterable, Any
def all_same(iterable: Iterable[Any]) -> bool:
"""Return True if all elements in iterable are equal
>>> all_same([3, 3, 3])
True
>>> all_same([3, 3, 1])
False
>>> all_same([])
True
>>> all_same(['a', 'a'])
True
"""
g = groupby(iterable)
return bool(next(g, True)) and not bool(next(g, False))
Я продолжаю получать эту ошибку о невозможности вывести type argument 1 of "next"
:
$ mypy testing.py
testing.py: note: In function "all_same":
testing.py:17: error: Cannot infer type argument 1 of "next"
Я полагаю, это означает, что он не может вывести здесь тип g
, верно?
Мне трудно понять, проблема ли это в аннотациях моего типа или в аннотациях типа для groupby
.
Для справки, это аннотация типа для groupby
а>:
@overload
def groupby(iterable: Iterable[_T]) -> Iterator[Tuple[_T, Iterator[_T]]]: ...
Таким образом, это означает, что «groupby принимает итерацию типа T и возвращает итератор кортежей, содержащих два элемента: (один элемент типа T, итератор объектов типа T)». Выглядит хорошо для меня, но тогда mypy должен быть в состоянии вывести первый аргумент next
как Iterator[Tuple[Any, Iterator[Any]]]
, верно?
Что мне не хватает?