より良い list/set/dict の内包表記を作成するのに役立つ flake8 プラグイン。
Django プロジェクトをリントしますか? Flake8 やその他多くのコード品質ツールについて説明した私の著書『Boost Your Django DX』をご覧ください。
Python 3.9 ~ 3.13 がサポートされています。
まず、 pip
でインストールします。
python -m pip install flake8-comprehensions
次に、Flake8 のselect
設定を定義する場合は、それにC4
プレフィックスを追加します。それ以外の場合、プラグインはデフォルトでアクティブになるはずです。
<list/set/dict>
内包表記として書き換えます。ルール:
これらの型には同等の内包表記があるため、ジェネレーター式の周囲でlist
、 set
、またはdict
使用する必要はありません。例えば:
list(f(x) for x in foo)
を[f(x) for x in foo]
に書き換えますset(f(x) for x in foo)
を{f(x) for x in foo}
に書き換えますdict((x, f(x)) for x in foo)
を{x: f(x) for x in foo}
に書き換えます<set/dict>
内包表記として書き換えます。ルール:
これらの型には同等の内包表記があるため、 set
またはdict
の呼び出し内でリスト内包表記を使用する必要はありません。例えば:
set([f(x) for x in foo])
を{f(x) for x in foo}
に書き換えますdict([(x, f(x)) for x in foo])
{x: f(x) for x in foo}
に書き換えます<list/tuple>
リテラル - <set/dict>
リテラルとして書き換えます。<list/tuple>
リテラル - セット リテラルとして書き換えます。<list/tuple>
リテラル - dict リテラルとして書き換えます。 set
またはdict
の呼び出し内でリストまたはタプル リテラルを使用する必要はありません。例えば:
set([1, 2])
{1, 2}
に書き換えますset((1, 2))
{1, 2}
として書き換えますset([])
をset()
に書き換えますdict([(1, 2)])
{1: 2}
として書き換えますdict(((1, 2),))
{1: 2}
として書き換えますdict([])
{}
に書き換えます<dict/list>
内包表記 - <builtin>
ジェネレーターを受け取ることができますこのルールは、バグにつながる可能性のある遅延の増加を促進したため、バージョン 3.4.0 で削除されました。
<dict/list/tuple>
呼び出し - リテラルとして書き換えます。リバインドされた場合に備えて名前dict
グローバル スコープで検索する必要があるため、空のリテラルを使用するよりもdict()
を呼び出す方が遅くなります。ここの他の 2 つの基本タイプについても同様です。例えば:
dict()
{}
として書き換えますdict(a=1, b=2)
{"a": 1, "b": 2}
に書き換えます。list()
[]
に書き換えますtuple()
()
に書き換えます<list/tuple>
が<list/tuple>
() - <advice>
に渡されました。ルール:
<list/tuple>
が tuple() - <advice>
に渡されました。<advice>
に渡されました。 <advice>
は次のいずれかです。
<list/tuple>
への外部呼び出しを削除します ()<list/tuple>
リテラルとして書き換えますこれらの型にはリテラル構文があるため、 list
またはtuple
の呼び出し内で list または tuple リテラルを使用する必要はありません。例えば:
tuple([1, 2])
(1, 2)
に書き換えますtuple((1, 2))
(1, 2)
に書き換えますtuple([])
()
に書き換えるlist([1, 2])
[1, 2]
に書き換えますlist((1, 2))
[1, 2]
に書き換えますlist([])
[]
に書き換えますリスト内包表記を使用しなくても同等であるため、リスト内包表記の周囲でlist
を使用する必要はありません。例えば:
list([f(x) for x in foo])
を[f(x) for x in foo]
に書き換えます<dict/list/set>
内包表記 - 'in' はジェネレータを受け取ることができます。このルールは、バグにつながる可能性のある遅延の増加を促進したため、バージョン 3.4.0 で削除されました。
<list/reversed>
呼び出しがsorted()の周りにあります。 list() はすでにリストを返しているため、 sorted()
の周囲でlist()
を使用する必要はありません。また、 sorted()
にはreverse
引数があるため、vertical() の前後でreversed()
を使用する必要もありません。例えば:
list(sorted([2, 3, 1]))
sorted([2, 3, 1])
に書き換えます。reversed(sorted([2, 3, 1]))
sorted([2, 3, 1], reverse=True)
に書き換えます。reversed(sorted([2, 3, 1], reverse=True))
sorted([2, 3, 1])
に書き換えます。<list/reversed/set/sorted/tuple>
> () 内の不要な<list/set/sorted/tuple>
呼び出し。 list
/ set
/ sorted
/ tuple
内でリストされた関数をラップすることで、反復可能オブジェクトをダブルキャストまたは二重処理する必要はありません。例えば:
list(list(iterable))
list(iterable)
に書き換えますlist(tuple(iterable))
list(iterable)
に書き換えますtuple(list(iterable))
tuple(iterable)
に書き換えますtuple(tuple(iterable))
tuple(iterable)
に書き換えますset(set(iterable))
set(iterable)
に書き換えますset(list(iterable))
set(iterable)
に書き換えますset(tuple(iterable))
set(iterable)
に書き換えますset(sorted(iterable))
set(iterable)
に書き換えますset(reversed(iterable))
set(iterable)
に書き換えますsorted(list(iterable))
sorted(iterable)
として書き換えますsorted(tuple(iterable))
sorted(iterable)
として書き換えますsorted(sorted(iterable))
sorted(iterable)
に書き換えますsorted(reversed(iterable))
sorted(iterable)
として書き換えます。<reversed/set/sorted>
() 内の iterable の不必要な添え字の反転。反復可能オブジェクトをリストされた関数のいずれかに渡すと順序が再び変更される場合、反復可能オブジェクトの順序を逆にする必要はありません。例えば:
set(iterable[::-1])
set(iterable)
に書き換えますsorted(iterable)[::-1]
sorted(iterable, reverse=True)
として書き換えます。reversed(iterable[::-1])
をiterable
として書き換えます<dict/list/set>
内包表記 - <dict/list/set>
() を使用して書き換えてください。要素が変更されていない場合、データ構造を構築するために dict/list/set 内包表記を使用する必要はありません。代わりに、 dict()
、 list()
、またはset()
を使用して反復可能オブジェクトをラップします。例えば:
{a: b for a, b in iterable}
dict(iterable)
に書き換えます[x for x in iterable]
をlist(iterable)
として書き換えます{x for x in iterable}
をset(iterable)
として書き換えますmap
の使用 - ジェネレーター式/ <list/set/dict>
内包表記を使用して書き換えます。 func
が組み込み関数である場合、 map(func, iterable)
優れたパフォーマンスを発揮します。また、関数にすでに名前が付いている場合は意味があります。ただし、 func がlambda
場合は、関数呼び出しのオーバーヘッドを回避できるため、ジェネレーター式または内包表記を使用した方が高速です。例えば:
map(lambda x: x + 1, iterable)
を(x + 1 for x in iterable)
に書き換えます。map(lambda item: get_id(item), items)
を(get_id(item) for item in items)
に書き換えますlist(map(lambda num: num * 2, nums))
を[num * 2 for num in nums]
に書き換えますset(map(lambda num: num % 2 == 0, nums))
を{num % 2 == 0 for num in nums}
dict(map(lambda v: (v, v ** 2), values))
{v : v ** 2 for v in values}
に書き換えます<dict/dict comprehension>
が dict() に渡されました - dict() への外部呼び出しを削除しますいずれかの構文で既に dict が構築されているため、dict リテラルまたは dict 内包表記の周囲でdict
使用する必要はありません。例えば:
dict({})
{}
に書き換えますdict({"a": 1})
{"a": 1}
に書き換えます<any/all>
() 内の不要なリスト内包によりショートサーキットが防止されます - ジェネレーターとして書き換えられます。 any()
/ all()
の呼び出し内でリスト内包表記を使用すると、 True
/ False
値が見つかったときのショートサーキットを防止できます。リスト全体はany()
/ all()
を呼び出す前に構築されるため、 work.part-way が無駄になる可能性があります。途中で停止する可能性があるジェネレーター式を使用するように書き直します。例えば:
all([condition(x) for x in iterable])
all(condition(x) for x in iterable)
に書き換えますany([condition(x) for x in iterable])
をany(condition(x) for x in iterable)
に書き換えますすべての値が同じ定数に設定された辞書を構築するために辞書内包表記を使用する必要はありません。代わりに、より高速なdict.fromkeys()
を使用してください。例えば:
{x: 1 for x in iterable}
dict.fromkeys(iterable, 1)
に書き換えます{x: None for x in iterable}
dict.fromkeys(iterable)
として書き換えます