A flake8 plugin to help you write better list/set/dict comprehensions.
Project description
flake8-comprehensions
A flake8 plugin that helps you write better list/set/dict comprehensions.
Installation
Install from pip with:
pip install flake8-comprehensions
Python 3.5-3.7 supported.
When installed it will automatically be run as part of flake8; you can check it is being picked up with:
$ flake8 --version
2.4.1 (pep8: 1.7.0, pyflakes: 0.8.1, flake8-comprehensions: 1.0.0, mccabe: 0.3.1) CPython 2.7.11 on Darwin
Rules
Code |
Rule |
---|---|
C400 |
Unnecessary generator - rewrite as a list comprehension. |
C401 |
Unnecessary generator - rewrite as a set comprehension. |
C402 |
Unnecessary generator - rewrite as a dict comprehension. |
C403 |
Unnecessary list comprehension - rewrite as a set comprehension. |
C404 |
Unnecessary list comprehension - rewrite as a dict comprehension. |
C405 |
Unnecessary (list/tuple) literal - rewrite as a set literal. |
C406 |
Unnecessary (list/tuple) literal - rewrite as a dict literal. |
C407 |
Unnecessary list comprehension - ‘<builtin>’ can take a generator. |
C408 |
Unnecessary (dict/list/tuple) call - rewrite as a literal. |
C409 |
Unnecessary (list/tuple) passed to tuple() - (remove the outer call to tuple()/rewrite as a tuple literal). |
C410 |
Unnecessary (list/tuple) passed to list() - (remove the outer call to list()/rewrite as a list literal). |
C411 |
Unnecessary list call - remove the outer call to list(). |
C412 |
Unnecessary list comprehension - ‘in’ can take a generator. |
Examples
C400-402: Unnecessary generator
It’s unnecessary to use list, set, or dict around a generator expression, since there are equivalent comprehensions for these types. For example:
Rewrite list(f(x) for x in foo) as [f(x) for x in foo]
Rewrite set(f(x) for x in foo) as {f(x) for x in foo}
Rewrite dict((x, f(x)) for x in foo) as {x: f(x) for x in foo}
C403-404: Unnecessary list comprehension
It’s unnecessary to use a list comprehension inside a call to set or dict, since there are equivalent comprehensions for these types. For example:
Rewrite set([f(x) for x in foo]) as {f(x) for x in foo}
Rewrite dict([(x, f(x)) for x in foo]) as {x: f(x) for x in foo}
C405-406,C409-410: Unnecessary list/tuple literal
It’s unnecessary to use a list or tuple literal within a call to tuple, list, set, or dict since there is literal syntax for these types. For example:
Rewrite tuple([1, 2]) or tuple((1, 2)) as (1, 2)
Rewrite tuple([]) as ()
Rewrite list([1, 2]) or list((1, 2)) as [1, 2]
Rewrite list([]) as []
Rewrite set([1, 2]) or set((1, 2)) as {1, 2}
Rewrite set([]) as set()
Rewrite dict([(1, 2)]) or dict(((1, 2),)) as {1: 2}
Rewrite dict([]) as {}
C407: Unnecessary list comprehension - ‘<builtin>’ can take a generator
It’s unnecessary to pass a list comprehension to some builtins that can take generators instead. For example:
Rewrite sum([x ** 2 for x in range(10)]) as sum(x ** 2 for x in range(10))
Rewrite all([foo.bar for foo in foos]) as all(foo.bar for foo in foos)
The list of builtins that are checked for are:
all
any
enumerate
frozenset
max
min
sorted
sum
tuple
C408: Unnecessary (dict/list/tuple) call - rewrite as a literal.
It’s slower to call e.g. dict() than using the empty literal, because the name dict must be looked up in the global scope in case it has been rebound. Same for the other two basic types here. For example:
Rewrite dict() as {}
Rewrite list() as []
Rewrite tuple() as ()
C411: Unnecessary list call - remove the outer call to list().
It’s unnecessary to use a list around list comprehension, since it is equivalent without it. For example:
Rewrite list([f(x) for x in foo]) as [f(x) for x in foo]
C412: Unnecessary list comprehension - ‘in’ can take a generator.
It’s unnecessary to pass a list comprehension to ‘in’ that can take a generator instead. For example:
Rewrite y in [f(x) for x in foo] as y in (f(x) for x in foo)
History
Pending Release
(Any notes for changes pending release go here.)
2.3.0 (2019-10-25)
Update Flake8 support to 3.0+ only. 3.0.0 was released in 2016 and the plugin hasn’t been tested with it since.
2.3.0 (2019-10-25)
Converted setuptools metadata to configuration file. This meant removing the __version__ attribute from the package. If you want to inspect the installed version, use importlib.metadata.version("flake8-comprehensions") (docs / backport).
Add dependencies on cached-property and importlib-metadata.
Fix false negatives in C407 for cases when enumerate and sum() are passed more than one argument.
2.2.0 (2019-08-12)
Update Python support to 3.5-3.7, as 3.4 has reached its end of life.
C412 rule that complains about using list comprehension with in.
2.1.0 (2019-03-01)
Add missing builtin enumerate to C407.
2.0.0 (2019-02-02)
Drop Python 2 support, only Python 3.4+ is supported now.
1.4.1 (2017-05-17)
Fix false positives in C408 for calls using *args or **kwargs.
1.4.0 (2017-05-14)
Plugin now reserves the full C4XX code space rather than just C40X
C408 rule that complains about using tuple(), list(), or dict() instead of a literal.
C409 and C410 rules that complain about an unnecessary list or tuple that could be rewritten as a literal.
C411 rule that complains about using list comprehension inside a list() call.
1.3.0 (2017-05-01)
Don’t allow installation with Flake8 3.2.0 which doesn’t enable the plugin. This bug was fixed in Flake8 3.2.1.
Prevent false positives of C402 from generators of expressions that aren’t two-tuples.
C405 and C406 now also complain about unnecessary tuple literals.
1.2.1 (2016-06-27)
C407 rule that complains about unnecessary list comprehensions inside builtins that can work on generators.
1.2.0 (2016-07-11)
Split all rule codes by type. This allows granular selection of the rules in flake8 configuration.
1.1.1 (2016-04-06)
Fix crash on method calls
1.1.0 (2016-04-06)
C401 rule that complains about unnecessary list comprehensions inside calls to set() or dict().
C402 rule that complains about unnecessary list literals inside calls to set() or dict().
1.0.0 (2016-04-05)
C400 rule that complains about an unnecessary usage of a generator when a list/set/dict comprehension would do.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for flake8-comprehensions-3.0.0.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | f5ca4f2b8752dbe7e49fc430290761bb4bd030d47bc1ba39bcaa24b79b0c8672 |
|
MD5 | f0c21daaf8328fc28ac53e09fc0b41a4 |
|
BLAKE2b-256 | 6582cc040f3e09fb795aab330e7e91653167a71dbe5a56d812069bd85dbd8076 |
Hashes for flake8_comprehensions-3.0.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 60a3d8eb8f29b11ba7dd22a9ba3641b8a5f241fbc31287d00d398eafe823d16d |
|
MD5 | 09c5563f638ad75fc75302086c776412 |
|
BLAKE2b-256 | 1915bbe16275edd5500a1aff2312f2225460d5a2f90f9b23b2af83452ed775f2 |