The mypy error is
Need type annotation for "args" [var-annotated]
Need type annotation for "kwargs" [var-annotated]
and here is the piece of code
expected_args: Optional[Sequence[Tuple[Any, ...]]]
expected_kwargs: Optional[Sequence[Dict[str, Any]]]
...
expected_args_iter = iter(expected_args or ())
expected_kwargs_iter = iter(expected_kwargs or ())
...
for args, kwargs in itertools.zip_longest(
expected_args_iter, expected_kwargs_iter, fillvalue={})
Where can I annotate "args" and "kwargs"?
This appears to be a bug in mypy v1.14.0. For some reason, any iteration over itertools.zip_longest()
with an empty sequence* in fillvalue
will cause a similar issue. This is the simplest example I could construct:
import itertools
seq_a: list
seq_b: list
for a, b in itertools.zip_longest(seq_a, seq_b, fillvalue=[]): ...
This is specific to both mypy and empty sequences. Non-empty sequences, non-sequences, and using Pyright are all fine.
In your particular case, you can work around this issue by leaving fillvalue
as its default (None
) and hard-coding an exception into your comprehension.
pretty_unused_args = [
', '.join(itertools.chain(
(repr(a) for a in args) if args is not None else [],
('%s=%r' % kwarg for kwarg in kwargs.items()) if kwargs is not None else []))
for args, kwargs in itertools.zip_longest(
expected_args_iter, expected_kwargs_iter)
]
*Besides ()
, but including tuple()