Prefer Generator Expressions Has Fix
Description
List comprehensions like [x for x in range(10)]
are a concise way to create lists in Python. However, we can achieve better memory efficiency by using generator expressions like (x for x in range(10))
instead. List comprehensions create the entire list in memory, while generator expressions generate each element one at a time. We can make the change by replacing the square brackets with parentheses.
YAML
id: prefer-generator-expressions
language: python
rule:
pattern: $LIST
kind: list_comprehension
transform:
INNER:
substring: {source: $LIST, startChar: 1, endChar: -1 }
fix: ($INNER)
This rule converts every list comprehension to a generator expression. However, not every list comprehension can be replaced with a generator expression. If the list is used multiple times, is modified, is sliced, or is indexed, a generator is not a suitable replacement.
Some common functions like any
, all
, and sum
take an iterable
as an argument. A generator function counts as an iterable
, so it is safe to change a list comprehension to a generator expression in this context.
id: prefer-generator-expressions
language: python
rule:
pattern: $FUNC($LIST)
constraints:
LIST: { kind: list_comprehension }
FUNC:
any:
- pattern: any
- pattern: all
- pattern: sum
# ...
transform:
INNER:
substring: {source: $LIST, startChar: 1, endChar: -1 }
fix: $FUNC($INNER)
Example
any([x for x in range(10)])
Diff
any([x for x in range(10)])
any(x for x in range(10))