flake8-bugbear icon indicating copy to clipboard operation
flake8-bugbear copied to clipboard

B031 does not take into account if-else statements

Open amyasnikov opened this issue 2 years ago • 2 comments

Bugbear reports false-positive "more that one" usage of the generator even if it occurs inside 2 different branches of the if-else statement.

This code

import itertools

for _, group in itertools.groupby([]):
    if True:
        print(group, True)
    else:
        print(group, False)

produces

b031.py:7:15: B031 Using the generator returned from `itertools.groupby()` more than once will do nothing on the second usage. Save the result to a list, if the result is needed multiple times.

but it's obvious that group cannot be used twice here.

flake8 --version:

7.0.0 (flake8-bugbear: 24.2.6, mccabe: 0.7.0, pycodestyle: 2.11.1, pyflakes: 3.2.0) CPython 3.11.2 on Linux

amyasnikov avatar Mar 24 '24 22:03 amyasnikov

On a related note, I am also getting false positive for code that only type-annotates the iterable. It iterates only once, but B031 is triggered:

        for form_id, form_obs in groupby(observations, key=lambda obs: obs.form):
            form_id: int
            form_obs: Iterable[Observation]
            pks: Iterable[int] = list(o.pk for o in form_obs)

mick88 avatar Aug 21 '24 11:08 mick88

Thanks for reporting. Both are things we could tighten. PRs welcome.

cooperlees avatar Aug 21 '24 13:08 cooperlees