reimplemented-starmap (FURB140)#
Derived from the refurb linter.
Fix is sometimes available.
This rule is unstable and in preview. The --preview
flag is required for use.
What it does#
Checks for generator expressions, list and set comprehensions that can
be replaced with itertools.starmap
.
Why is this bad?#
When unpacking values from iterators to pass them directly to
a function, prefer itertools.starmap
.
Using itertools.starmap
is more concise and readable. Furthermore, it is
more efficient than generator expressions, and in some versions of Python,
it is more efficient than comprehensions.
Known problems#
Since Python 3.12, itertools.starmap
is less efficient than
comprehensions (#7771). This is due to PEP 709, which made
comprehensions faster.
Example#
scores = [85, 100, 60]
passing_scores = [60, 80, 70]
def passed_test(score: int, passing_score: int) -> bool:
return score >= passing_score
passed_all_tests = all(
passed_test(score, passing_score)
for score, passing_score in zip(scores, passing_scores)
)
Use instead:
from itertools import starmap
scores = [85, 100, 60]
passing_scores = [60, 80, 70]
def passed_test(score: int, passing_score: int) -> bool:
return score >= passing_score
passed_all_tests = all(starmap(passed_test, zip(scores, passing_scores)))