Plugin flake8 yang membantu Anda menulis pemahaman daftar/set/dikt yang lebih baik.
Linting proyek Django? Lihat buku saya Tingkatkan Django DX Anda yang mencakup Flake8 dan banyak alat kualitas kode lainnya.
Python 3.9 hingga 3.13 didukung.
Pertama, instal dengan pip
:
python -m pip install flake8-comprehensions
Kedua, jika Anda menentukan pengaturan select
Flake8, tambahkan awalan C4
ke dalamnya. Jika tidak, plugin seharusnya aktif secara default.
<list/set/dict>
.Aturan:
Tidak perlu menggunakan list
, set
, atau dict
pada ekspresi generator, karena ada pemahaman yang setara untuk tipe ini. Misalnya:
list(f(x) for x in foo)
sebagai [f(x) for x in foo]
set(f(x) for x in foo)
sebagai {f(x) for x in foo}
dict((x, f(x)) for x in foo)
menjadi {x: f(x) for x in foo}
<set/dict>
.Aturan:
Tidak perlu menggunakan pemahaman daftar di dalam panggilan ke set
atau dict
, karena ada pemahaman yang setara untuk tipe ini. Misalnya:
set([f(x) for x in foo])
sebagai {f(x) for x in foo}
dict([(x, f(x)) for x in foo])
sebagai {x: f(x) for x in foo}
<list/tuple>
yang tidak diperlukan - tulis ulang sebagai literal <set/dict>
.<list/tuple>
yang tidak perlu - tulis ulang sebagai satu set literal.<list/tuple>
yang tidak perlu - tulis ulang sebagai dict literal. Tidak perlu menggunakan literal list atau tuple dalam panggilan ke set
atau dict
. Misalnya:
set([1, 2])
menjadi {1, 2}
set((1, 2))
menjadi {1, 2}
set([])
sebagai set()
dict([(1, 2)])
menjadi {1: 2}
dict(((1, 2),))
menjadi {1: 2}
dict([])
sebagai {}
<dict/list>
yang tidak perlu - <builtin>
dapat menggunakan generatorAturan ini dibatalkan di versi 3.4.0, karena mendorong peningkatan kemalasan yang dapat menyebabkan bug.
<dict/list/tuple>
yang tidak perlu - tulis ulang sebagai literal. Memanggilnya lebih lambat misalnya dict()
daripada menggunakan literal kosong, karena nama dict
harus dicari dalam cakupan global kalau-kalau sudah di-rebound. Sama untuk dua tipe dasar lainnya di sini. Misalnya:
dict()
sebagai {}
dict(a=1, b=2)
menjadi {"a": 1, "b": 2}
list()
sebagai []
tuple()
sebagai ()
<list/tuple>
yang tidak perlu diteruskan ke <list/tuple>
() - <advice>
.Aturan:
<list/tuple>
yang tidak perlu diteruskan ke tuple() - <advice>
.<advice>
. Dimana <advice>
adalah:
<list/tuple>
()<list/tuple>
literal Tidak perlu menggunakan literal list atau tuple dalam panggilan ke list
atau tuple
, karena ada sintaks literal untuk tipe ini. Misalnya:
tuple([1, 2])
menjadi (1, 2)
tuple((1, 2))
menjadi (1, 2)
tuple([])
sebagai ()
list([1, 2])
sebagai [1, 2]
list((1, 2))
sebagai [1, 2]
list([])
sebagai []
Tidak perlu menggunakan list
di sekitar pemahaman daftar, karena tanpa itu setara. Misalnya:
list([f(x) for x in foo])
sebagai [f(x) for x in foo]
<dict/list/set>
yang tidak perlu - 'dalam' dapat memerlukan generator.Aturan ini dibatalkan di versi 3.4.0, karena mendorong peningkatan kemalasan yang dapat menyebabkan bug.
<list/reversed>
yang tidak perlu disortir(). Tidak perlu menggunakan list()
di sekitar sorted()
karena sudah mengembalikan daftar. Juga tidak perlu menggunakan reversed()
di sekitar sorted()
karena yang terakhir memiliki argumen reverse
. Misalnya:
list(sorted([2, 3, 1]))
sebagai sorted([2, 3, 1])
reversed(sorted([2, 3, 1]))
sebagai sorted([2, 3, 1], reverse=True)
reversed(sorted([2, 3, 1], reverse=True))
sebagai sorted([2, 3, 1])
<list/reversed/set/sorted/tuple>
yang tidak diperlukan dalam <list/set/sorted/tuple>
(). Tidak perlu melakukan double-cast atau double-process iterable dengan membungkus fungsi-fungsi yang terdaftar di dalam list
/ set
/ sorted
/ tuple
. Misalnya:
list(list(iterable))
menjadi list(iterable)
list(tuple(iterable))
sebagai list(iterable)
tuple(list(iterable))
sebagai tuple(iterable)
tuple(tuple(iterable))
menjadi tuple(iterable)
set(set(iterable))
sebagai set(iterable)
set(list(iterable))
sebagai set(iterable)
set(tuple(iterable))
sebagai set(iterable)
set(sorted(iterable))
sebagai set(iterable)
set(reversed(iterable))
sebagai set(iterable)
sorted(list(iterable))
sebagai sorted(iterable)
sorted(tuple(iterable))
sebagai sorted(iterable)
sorted(sorted(iterable))
sebagai sorted(iterable)
sorted(reversed(iterable))
sebagai sorted(iterable)
<reversed/set/sorted>
().Tidak perlu membalik urutan iterable ketika meneruskannya ke salah satu fungsi yang terdaftar akan mengubah urutannya lagi. Misalnya:
set(iterable[::-1])
sebagai set(iterable)
sorted(iterable)[::-1]
sebagai sorted(iterable, reverse=True)
reversed(iterable[::-1])
sebagai iterable
<dict/list/set>
yang tidak perlu - menulis ulang menggunakan <dict/list/set>
(). Tidak perlu menggunakan pemahaman dict/list/set untuk membangun struktur data jika elemennya tidak berubah. Bungkus iterable dengan dict()
, list()
, atau set()
sebagai gantinya. Misalnya:
{a: b for a, b in iterable}
sebagai dict(iterable)
[x for x in iterable]
sebagai list(iterable)
{x for x in iterable}
sebagai set(iterable)
map
yang tidak perlu - menulis ulang menggunakan ekspresi generator/ pemahaman <list/set/dict>
. map(func, iterable)
memiliki kinerja yang hebat jika func
merupakan fungsi bawaan, dan masuk akal jika fungsi Anda sudah memiliki nama. Namun jika fungsi Anda adalah lambda
, akan lebih cepat jika menggunakan ekspresi generator atau pemahaman, karena ini menghindari overhead pemanggilan fungsi. Misalnya:
map(lambda x: x + 1, iterable)
menjadi (x + 1 for x in iterable)
map(lambda item: get_id(item), items)
menjadi (get_id(item) for item in items)
list(map(lambda num: num * 2, nums))
menjadi [num * 2 for num in nums]
set(map(lambda num: num % 2 == 0, nums))
menjadi {num % 2 == 0 for num in nums}
dict(map(lambda v: (v, v ** 2), values))
menjadi {v : v ** 2 for v in values}
<dict/dict comprehension>
yang tidak perlu diteruskan ke dict() - hapus panggilan luar ke dict() Tidak perlu menggunakan dict
di sekitar literal dict atau pemahaman dict, karena salah satu sintaks sudah membuat dict. Misalnya:
dict({})
sebagai {}
dict({"a": 1})
menjadi {"a": 1}
<any/all>
() mencegah hubungan arus pendek - menulis ulang sebagai generator. Menggunakan pemahaman daftar di dalam panggilan ke any()
/ all()
mencegah hubungan arus pendek ketika nilai True
/ False
ditemukan. Seluruh daftar akan dibuat sebelum memanggil any()
/ all()
, yang berpotensi membuang-buang pekerjaan. Tulis ulang untuk menggunakan ekspresi generator, yang bisa berhenti di tengah jalan. Misalnya:
all([condition(x) for x in iterable])
sebagai all(condition(x) for x in iterable)
any([condition(x) for x in iterable])
sebagai any(condition(x) for x in iterable)
Tidak perlu menggunakan pemahaman dict untuk membuat dict dengan semua nilai disetel ke konstanta yang sama. Gunakan dict.fromkeys()
sebagai gantinya, yang lebih cepat. Misalnya:
{x: 1 for x in iterable}
sebagai dict.fromkeys(iterable, 1)
{x: None for x in iterable}
sebagai dict.fromkeys(iterable)