ปลั๊กอิน flake8 ที่ช่วยให้คุณเขียน list/set/dict comprehensions ได้ดีขึ้น
กำลัง Lining โครงการ Django หรือไม่? ลองอ่านหนังสือของฉัน Boost Your Django DX ซึ่งครอบคลุม Flake8 และเครื่องมือคุณภาพโค้ดอื่นๆ อีกมากมาย
รองรับ Python 3.9 ถึง 3.13
ขั้นแรกให้ติดตั้งด้วย pip
:
python -m pip install flake8-comprehensions
ประการที่สอง หากคุณกำหนดการตั้งค่า select
ของ Flake8 ให้เพิ่มคำนำหน้า 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>
กฎ:
ไม่จำเป็นที่จะต้องใช้ list comprehension ในการเรียก 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 ไม่จำเป็นที่จะต้องใช้ list หรือ tuple literal ในการเรียก 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
จะต้องถูกค้นหาในขอบเขตส่วนกลาง ในกรณีที่มีการดีดกลับ เช่นเดียวกับอีกสองประเภทพื้นฐานที่นี่ ตัวอย่างเช่น:
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 literal ในการเรียกไปยัง 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>
ที่ไม่จำเป็น เป็นการเรียงลำดับ() ไม่จำเป็นต้องใช้ list()
รอบ sorted()
เพราะมันส่งคืนรายการไปแล้ว นอกจากนี้ยังไม่จำเป็นต้องใช้ reversed()
รอบ sorted()
เนื่องจากอันหลังมีอาร์กิวเมนต์ reverse
ตัวอย่างเช่น:
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))
as sorted([2, 3, 1])
<list/reversed/set/sorted/tuple>
ที่ไม่จำเป็นภายใน <list/set/sorted/tuple>
() ไม่จำเป็นต้องทำซ้ำแบบ double-cast หรือ double-process โดยล้อมฟังก์ชันที่อยู่ในรายการไว้ภายใน 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))
as sorted(iterable)
sorted(tuple(iterable))
ตาม sorted(iterable)
sorted(sorted(iterable))
as sorted(iterable)
sorted(reversed(iterable))
ตาม sorted(iterable)
<reversed/set/sorted>
()ไม่จำเป็นต้องกลับลำดับของการทำซ้ำได้เมื่อส่งผ่านไปยังฟังก์ชันใดฟังก์ชันหนึ่งในรายการ จะเปลี่ยนลำดับอีกครั้ง ตัวอย่างเช่น:
set(iterable[::-1])
ใหม่เป็น set(iterable)
sorted(iterable)[::-1]
as sorted(iterable, reverse=True)
reversed(iterable[::-1])
เป็น iterable
<dict/list/set>
ที่ไม่จำเป็น - เขียนใหม่โดยใช้ <dict/list/set>
() ไม่จำเป็นต้องใช้ dict/list/set comprehension เพื่อสร้างโครงสร้างข้อมูลหากองค์ประกอบไม่เปลี่ยนแปลง ล้อม iterable ด้วย 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>
ความเข้าใจ map(func, iterable)
มีประสิทธิภาพที่ยอดเยี่ยมเมื่อ func
เป็นฟังก์ชันในตัว และมันก็สมเหตุสมผลถ้าฟังก์ชันของคุณมีชื่ออยู่แล้ว แต่ถ้า 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({"a": 1})
ใหม่เป็น {"a": 1}
<any/all>
() ป้องกันการลัดวงจร - เขียนใหม่เป็นตัวสร้าง การใช้รายการความเข้าใจในการเรียกไปยัง any()
/ all()
ป้องกันการลัดวงจรเมื่อพบค่า True
/ False
รายการทั้งหมดจะถูกสร้างขึ้นก่อนที่จะเรียก any()
/ all()
ซึ่งอาจจะทำให้เสีย work.part-way เขียนใหม่เพื่อใช้นิพจน์ตัวสร้าง ซึ่งสามารถหยุดการแยกส่วนได้ ตัวอย่างเช่น:
all([condition(x) for x in iterable])
as all(condition(x) for x in iterable)
any([condition(x) for x in iterable])
เป็น any(condition(x) for x in iterable)
ไม่จำเป็นที่จะต้องใช้ dict comprehension เพื่อสร้าง dict โดยมีค่าทั้งหมดที่ตั้งค่าเป็นค่าคงที่เดียวกัน ใช้ dict.fromkeys()
แทน ซึ่งเร็วกว่า ตัวอย่างเช่น:
{x: 1 for x in iterable}
เป็น dict.fromkeys(iterable, 1)
{x: None for x in iterable}
เป็น dict.fromkeys(iterable)