mypy 错误是
Need type annotation for "args" [var-annotated]
Need type annotation for "kwargs" [var-annotated]
这是一段代码
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 ())
...
pretty_unused_args = [
', '.join(itertools.chain(
(repr(a) for a in args),
('%s=%r' % kwarg for kwarg in kwargs.items())))
for args, kwargs in itertools.zip_longest(
expected_args_iter, expected_kwargs_iter, fillvalue={})
]
在哪里可以注释“args”和“kwargs”?
这似乎是 mypy v1.14.0 中的一个错误,我已在 GitHub 上报告了。由于某种原因,在
itertools.zip_longest()
中使用空序列* 对 fillvalue
进行的任何迭代都会导致类似的问题。这是我可以构造的最简单的例子:
import itertools
seq_a: list
seq_b: list
for a, b in itertools.zip_longest(seq_a, seq_b, fillvalue=[]): ...
这是特定于 mypy 和空序列的。非空序列、非序列、使用 Pyright 都可以。
在您的特定情况下,您可以通过将
fillvalue
保留为其默认值 (None
) 并将异常硬编码到您的理解中来解决此问题。
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)
]
*除了
()
,还包括tuple()