在循环的列表理解中键入注释

问题描述 投票:0回答:1

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”?

python python-typing mypy
1个回答
0
投票

这似乎是 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()

© www.soinside.com 2019 - 2024. All rights reserved.