مكون إضافي لـflake8 يساعدك على كتابة فهم أفضل للقائمة/المجموعة/الإملاء.
فحص مشروع جانغو؟ تحقق من كتابي Boost Your Django DX الذي يغطي Flake8 والعديد من أدوات جودة التعليمات البرمجية الأخرى.
يدعم بايثون 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>
.قواعد:
ليس من الضروري استخدام فهم القائمة داخل استدعاء 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>
حرفي غير ضروري - أعد الكتابة كإملاء حرفي. ليس من الضروري استخدام قائمة أو مجموعة حرفية داخل مكالمة 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>
غير ضروري حولsorted(). ليس من الضروري استخدام 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))
حسب 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>
().ليس من الضروري عكس ترتيب العناصر القابلة للتكرار عندما يؤدي تمريرها إلى إحدى الوظائف المدرجة إلى تغيير الترتيب مرة أخرى. على سبيل المثال:
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()
بدلاً من ذلك. على سبيل المثال:
{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({"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)