كيفية كتابة كود بايثون نظيف Python Clean Code

كيفية-كتابة-كود-بايثون-نظيف-وجميل-Python-Clean-Code

كيفية كتابة كود بايثون نظيف Python Clean Code

في هذا المقال سأقدم بعض الإرشادات وأفضل الممارسات حول كيفية كتابة كود بايثون نظيف وجميل, لكن مهلاً

ماذا تعني بكود نظيف ؟

الكود النظيف أو Clean Code باختصار هو كتابة شفرة برمجية منسّقة ومنظّمة وعلى اسس منطقية, قد تسأل نفسك لماذا يجب علي كتابة كود نظيف مادام الكمبيوتر لا يفهم سوى الصفر والواحد ولن يرى جمال الكود ولا تنسيقه, اذن :

لماذا هذا الاهتمام بتنظيم الكود و قابلية القراءة ؟

كما قال جايدو ڤان روسم (Guido van Rossum) هو مبرمج هولندي يُعرف بأنه مبتكر لغة البرمجة بايثون، "تتم قراءة الكود أكثر مما هو مكتوب" ويعني بذلك أنه يمكنك قضاء بضع دقائق ، أو يوم كامل ، في كتابة جزء من التعليمات البرمجية لمعالجة تسجيل الدخول لمستخدم. وبمجرد كتابتها ، لن تكتبها مرة أخرى. ولكن عليك بالتأكيد قراءتها مرة أخرى. 

قد تبقى هذه الشفرة جزءًا من مشروع تعمل عليه. في كل مرة تعود فيها إلى هذا الملف ، عليك أن تتذكر ما يفعله هذا الكود وسبب كتابته ، لذا فإن قابلية القراءة مهمة.

  • إذا كنت جديدًا في بايثون، فقد يكون من الصعب تذكر ما تفعله إحدى التعليمات البرمجية خلال بضعة أيام أو أسابيع من كتابته.يجب أن تعرف أن أغلب المشاريع بدأت صغيرة ثم بدأت تكبر وتتطور بفضل تعدد المبرمجين والمطورين وتعاونهم, فربما تكتب الان برنامج ثم ترفعه على موقع جيت هب Github فيقوم بتحميله مبرمج اخر لغرض تطويره واضافة ميزات اخرى للبرنامج, ولكن لسوء الحظ يجد هذا المبرمج أن برنامجك تمت كتابته بطريقة غير منظمة وغير مفهومة وسيقضي وقت كبير في فهم المتغيرات اوالدوال التي كتبتها, لكن في أغلب الأحيان يفضل هذا المطور إعادة بناء المشروع من الصفر على القيام بالتعديل عليه وتضييع وقته.

ما هي العوامل التي يجب عليك مراعتها لكتابة كود نظيف؟

اتفاقية التسمية Naming Conventions

عندما تبرمج في لغة بايثون ، يجب عليك تسمية الكثير من الأشياء: المتغيرات ، الوظائف ، الأصناف ، الحزم ، وما إلى ذلك. 

اختيار أسماء منطقية ومعقولة سيوفر عليك الوقت والجهد في وقت لاحق لأنك ستتمكن من معرفة ما يمثله متغير معين أو وظيفة أو فئة معينة بمجرد قراءة الاسم. كما ستتجنب استخدام أسماء غير لائقة inappropriate قد تؤدي إلى أخطاء يصعب تصحيحها في المستقبل. سأعطيك مثالا:

لاحظ هذه الشفرة البرمجية:
O  =  2   # قد يبدو هذا وكأنك تحاول اسناد قيمة 2 إلى صفر
في بعض الأحيان بعض الخطوط التي نستعملها ستخلط عليك الامر وتظن أن 1 و 0 هي O و I ولا تفرق بين رقم واحد والحرف I
أو بين الصفر 0 وحرف O لاتيني 
ولهذا اتفق المبرمجون على اسس وقواعد للتسمية يمكن اعتبارها اتفاقية لتوحيد التسميات فيما بينهم
يوضح الجدول أدناه بعض أنماط التسمية الشائعة في كود Python ، وحين يجب عليك استخدامها:

أنماط التسمية Naming Styles

النوع الاتفاقية أمثلة
Function
الوظيفة
استخدم كلمة أو كلمات صغيرة. افصل الكلمات باستخدام شرطات سفلية لتحسين القراءة. functionmy_function
Variable
متغير
استخدم حرفًا واحدًا صغيرًا أو كلمة أو كلمات. افصل الكلمات مع الشرطات السفلية لتحسين قابلية القراءة. xvarmy_variable
Class
الفئة
ابدأ كل كلمة بحرف كبير. لا تفصل بين الكلمات والشرطات السفلية. هذا النمط يدعى حالة الجمل Camelcase ModelMyClass
Method
الطريقة
استخدم كلمة أو كلمات صغيرة. افصل الكلمات مع الشرطات السفلية لتحسين قابلية القراءة. class_methodmethod
Constant
الثابت
استخدم حرفًا واحدًا كبيرًا أو كلمة أو كلمات. افصل الكلمات مع الشرطات السفلية لتحسين قابلية القراءة. CONSTANTMY_CONSTANT,
MY_LONG_CONSTANT
Module
الوحدة
استخدم كلمة أو كلمات قصيرة أو صغيرة. افصل الكلمات مع الشرطات السفلية لتحسين قابلية القراءة. module.pymy_module.py
Package
الحزم
استخدم كلمة أو كلمات قصيرة أو صغيرة. لا تفصل بين الكلمات والشرطات السفلية. packagemypackage

هذه بعض من اصطلاحات التسمية الشائعة وأمثلة حول كيفية استخدامها. ولكن لكتابة رمز قابل للقراءة ، لا يزال يتعين عليك توخي الحذر مع اختيارك للحروف والكلمات. بالإضافة إلى اختيار أنماط التسمية الصحيحة في شفرتك ، يجب عليك أيضًا اختيار الأسماء بعناية. فيما يلي بعض المؤشرات حول كيفية القيام بذلك بأكبر قدر ممكن من الفعالية.

كيفية اختيار الأسماء

يمكن أن يمثل اختيار الأسماء للمتغيرات والوظائف والفئات وما إلى ذلك تحديًا للمبرمج. يجب أن تضع قدرًا من الاهتمام في اختيارات التسميات الخاصة بك عند كتابة التعليمات البرمجية. لأنها ستجعل شفرة برنامجك أكثر قابلية للقراءة. 
أفضل طريقة لتسمية كائناتك في Python هي استخدام الأسماء الوصفية لتوضيح ما يمثله الكائن أو المتغير.
عند تسمية المتغيرات ، قد يميل المبرمج لاختيار أسماء صغيرة وبسيطة من حرف واحد ، مثل x. ولكن  ما لم تستخدم x كدالة رياضية ونحوها ، فليس من الواضح اذا ما الذي يمثله حرف x !. تخيل أنك تقوم بتخزين اسم شخص كسلسلة ، وتريد استخدام تقطيع السلسلة لتنسيق اسم الشخص بشكل مختلف. لنرى هذا المثال:

>>> x  =  'Cortex Hacker'
>>> y ،  z  =  x . split ()
>>> print ( z ،  y ،  sep = '،' )
'Hacker، Cortex'
طبعا سيؤدي الكود دوره ويعطينا النتيجة, لكن ألا ترى معي أن الكود مربك قليلا وغير واضح
لاحظ معي كيف يكون الكود النظيف:
>>> # مستحسن
>>> name  =  'Cortex Hacker'
>>> first_name ،  last_name  =  name . split ()
>>> print ( last_name ،  first_name ،  sep = '،' )
'Hacker، Cortex'
هل لاحظت الفرق ؟. اعتقد أن الأمر بات واضحاً الان.

الاختصارات

وبالمثل ، لتقليل كمية الكتابة التي تقوم بها ، قد يكون من المغري استخدام الاختصارات عند اختيار الأسماء. 
في المثال أدناه ، قمت بتعريف دالة بسيطة  ()mp تأخذ مدخل أو بارمترواحد هو (x) وتقوم بمضاعفته :
# غير مستحسن
def  mp ( x ):
    return  x  *  2
للوهلة الأولى ، قد يبدو هذا خيارًا معقولًا. ()mp يمكن بسهولة أن يكون اختصار لمضاعفة عدد multiply
ولكن تخيل معي أنك تركت برمجة مشروعك  أيام قليلة ثم عدت لتكمله. ربما تكون قد نسيت ما كنت تحاول تحقيقه من خلال هذه الوظيفة ، وهذا من شأنه أن يجعل من التفكير في كيفية اختصاره أمرًا صعبًا.
المثال التالي أكثر وضوحا. بحيث إذا عدت إلى هذا الكود بعد يومين من كتابته ، فستظل قادرًا على قراءة وفهم الغرض من هذه الوظيفة:
# مستحسن
def multiply_by_two(x):
    return x * 2
تنطبق نفس الفلسفة على جميع أنواع البيانات والكائنات الأخرى في Python. حاول دائمًا استخدام أكثر الأسماء شيوعًا لاعطائها وصف يجسد دورها.

تخطيط التعليمات البرمجية Code Layout

كما يقول المثل:
“Beautiful is better than ugly.”
والذي يعني   
"جميل أفضل من قبيحة."
كما تعلم مكان وضع كودك في المحرر يلعب دور كبير في كيفية قراءته. 
ستتعرف في هذا القسم على كيفية إضافة مسافة بيضاء عمودية لتحسين إمكانية قراءة الشفرة. 
وستتعلم أيضًا كيفية التعامل مع الحد المسموح به لعدد الأحرف المسموح به والبالغ 79 حرفًا في PEP 8.

الأسطر الفارغة Blank Lines

يمكن أن تؤدي المسافات البيضاء العمودية  Vertical whitespace أو الأسطر الفارغة إلى تحسين إمكانية قراءة التعليمة البرمجية بشكل كبير. 
لانه عند تجميعها ستصبح الشفرات متداخلة مع بعضها البعض مما يصعب قراءتها فيما بعد. وبالمثل ، فإن العديد من الأسطر الفارغة في شفرتك تجعلها تبدو متفرقة جدًا، وقد يحتاج القارئ إلى التمرير (scrollbar) أكثر من اللازم. 
فيما يلي ثلاثة إرشادات ونصائح أساسية حول كيفية استخدام المسافة البيضاء العمودية.
  • تحيط وظائف وفئات المستوى الأعلى مع سطرين فارغين. 
  • يجب أن تكون الوظائف والفئات ذات المستوى الأعلى قائمة بذاتها تمامًا وتتعامل مع وظائف منفصلة. 
  • الافضل ترك مسافة عمودية حولها ، بحيث يكون واضحًا أن الوظائف مستقلة فيما بينها.
مثال:

class  MyFirstClass :
    pass

class  MySecondClass :
    pass

def  top_level_function ():
    return  None

ينصح بترك سطر فارغ واحد فقط. داخل الكلاس او الفئة, وذلك عندما تكون الوظائف مرتبطة ببعضها البعض. فمن الأفضل عدم ترك سوى سطر واحد بينهما :
class MyClass:
    def first_method(self):
        return None
    def second_method(self):
        return None
استخدم الاسطر الفارغة داخل الدوال لتمييز الخطوات وجعلها واضحة. في بعض الأحيان، يجب أن تكمل إحدى الوظائف المعقدة عدة خطوات قبل العودة للعبارة return. وهذا يساعد القارئ على فهم المنطق داخل الدالة ، قد يكون من المفيد ترك سطر فارغ بين كل خطوة . مثال:
def calculate_variance(number_list):
    sum_list = 0
    for number in number_list:
        sum_list = sum_list + number
    mean = sum_list / len(number_list)
    sum_squares = 0
    for number in number_list:
        sum_squares = sum_squares + number**2
    mean_squares = sum_squares / len(number_list)
    return mean_squares - mean**2
إذا كنت تستخدم أسطر فارغة أو مسافات عموديًا بعناية ، فقد يؤدي ذلك إلى تحسن كبير في قراءة الشفرة البرمجية. 
فهي تساعد القارئ على فهم كيفية تقسيم الشفرة إلى أقسام ، وكيف ترتبط هذه الأقسام ببعضها البعض.

الحد الأقصى لطول السطر وتقسيم الاسطر:

لا يحبذ ان تكون السطر البرمجي طويل جدا, يجب أن يكون السطر محدودة إلى 79 حرفًا. 
بالطبع ، لا يمكن دائمًا الحفاظ على طول العبارات إلى 79 حرفًا أو أقل.ولكن هناك طرق تسمح بتقسيم العبارات عبر عدة أسطر.
في حالة كان السطر ينتهي باقواس أو ما شابه قم بتقسيمه بهذه الطريقة
def function(arg_one, arg_two,
             arg_three, arg_four):
    return arg_one
وفي حالات أخرى بهذه الكيفية:
from mypkg import example1, \
    example2, example3
في حالة كان الكود يحتوي على معاملات مثل +  او - وغيرها مثال هذا الكود:
total = (first_variable + second_variable - third_variable)
هناك من يقوم بتقسيمه بهذه الطريقة, ولكنها غير مستحسنة
total = (first_variable +
         second_variable -
         third_variable)
ينصح بتقسيمه بهذه الكيفية
# مستحسن
total = (first_variable
         + second_variable
         - third_variable)

المسافة البادئة Indentation :

المسافة البادئة ، أو المسافة البيضاء مهمة للغاية في بايثون. فهي تحدد مستوى المسافة البادئة لسطورالتعليمات البرمجية في بايثون وكيفية تجميع العبارات معاً.خذ بعين الاعتبار المثال التالي:
x = 3
if x > 5:
    print('x is larger than 5')
تسمح المسافة البادئة لبايثون بمعرفة أن تعليمة الطباعة Print لا تنفذ سوى داخل الشرط if. بمعنى أخر لا تنفذ الا في حالة كان الشرط صحيح True. 
فالمسافة البادئة تخبر بايثون بالشفرة التي يتم تنفيذها عند استدعاء الدالة أو الكود الذي ينتمي إلى فئة معينة.
قواعد المسافة البادئة الرئيسية التي وضعتها PEP 8 هي:
  • استخدم 4 مسافات متتالية للإشارة إلى المسافة البادئة.
  • يفضل استخدام المسافات بدلاً من استخدام علامة التبويب TAB.

مسافة التعليق hanging indent

هو مصطلح مطبعي يعني أن كل سطر يكون الأول في الفقرة أو المقال يتم وضع مسافة بادئة له. 
يمكنك استخدام مسافة بادئة معلقة hanging لتمثل استمرارًا لسلسلة من التعليمات البرمجية. 
إليك مثال على ذلك
# غير مستحسن
var = function(arg_one, arg_two,
    arg_three, arg_four)
بتطبيق المسافة المعلقة
# مستحسن
var = function(
    arg_one, arg_two,
    arg_three, arg_four)
عند استخدام مسافة بادئة معلقة ، قم بإضافة مسافة بادئة إضافية لتمييز السطر المقسم, من التعليمة البرمجية الموجودة داخل الدالة. يصعب قراءة المثال التالي لأن التعليمة البرمجية الموجودة داخل الدالة تكون عند نفس المسافة البادئة للسطر المستمر:
# غير مستحسن
def function(
    arg_one, arg_two,
    arg_three, arg_four):
    return arg_one
من الأفضل زيادة مسافة بادئة ليصبح بهذا الشكل
def function(
        arg_one, arg_two,
        arg_three, arg_four):
    return arg_one

كيفية اغلاق الأقواس:

هناك طريقتين لفعل ذلك
اصطفاف قوس الإغلاق مع أول مسافة غير بيضاء في السطر السابق:
list_of_numbers  =  [
    1 ،  2 ،  3 ،
    4 ،  5 ،  6 ،
    7 ،  8 ،  9
    ]
اصطفاف قوس الإغلاق مع أول حرف في السطر الذي يبدأ الإنشاء:
list_of_numbers  =  [
    1 ،  2 ،  3 ،
    4 ،  5 ،  6 ،
    7 ،  8 ،  9
]
أنت حر في اختيار النسق الذي تستخدمه. ولكن ، كما هو الحال دائمًا ، يكون التناسق أمرًا أساسيًا ، لذا حاول الالتزام بأحد الطرق المذكورة أعلاه.

التعليقات Comments

يجب عليك استخدام التعليقات على الكود كما هو مكتوب. من المهم توثيق شفرتك حتى تتمكن أنت وأية شريك لك من فهمها. 
عندما تقرأ أنت أو أي شخص آخر تعليقًا ، يجب أن يكون بمقدورهم فهم الكود الذي ينطبق عليه التعليق بسهولة وطريقة تناسبه مع بقية الشفرة.
إليك بعض النقاط الأساسية التي يجب تذكرها عند إضافة تعليقات إلى شفرتك:
  • الحد من طول خط التعليقات و docstrings إلى 72 حرفًا.
  • استخدم جمل كاملة ، تبدأ بحرف كبير.
  • تأكد من تحديث التعليقات إذا قمت بتغيير شفرتك.

كتلة التعليقات Block Comments

استخدم هذا النوع لتوثيق جزء صغير من الكود. هي مفيدة عندما تضطر إلى كتابة عدة أسطر من الكود لتنفيذ إجراء واحد ، مثل استيراد البيانات من ملف أو تحديث إدخال قاعدة بيانات. فهي مهمة لأنها تساعد الآخرين على فهم غرض ووظيفة كتلة الرموز المعطاة.

يوفر PEP 8 القواعد التالية لكتلة التعليقات Block Comments :
  • ضع تعليقات كتلة بادئة على نفس مستوى الكود البرمجي الذي يصفونه.
  • ابدأ كل سطر # متبوعًا بمسافة واحدة.
  • افصل بين الفقرات بخط يحتوي على مفردة #.
هنا مثال لتعليق الكتلة يشرح وظيفة حلقة for. 
لاحظ أن الجملة تلتف على سطر جديد للاحتفاظ بحد الخط البالغ 79 حرفًا:
for i in range(0, 10):
    # Loop over i ten times and print out the value of i, followed by a
    # new line character
    print(i, '\n')
في بعض الأحيان ، إذا كانت الشفرة البرمجية معقدة للغاية ، فمن الضروري استخدام أكثر من فقرة واحدة في تعليق كتلة:
def quadratic(a, b, c, x):
    # Calculate the solution to a quadratic equation using the quadratic
    # formula.
    #
    # There are always two solutions to a quadratic equation, x_1 and x_2.
    x_1 = (- b+(b**2-4*a*c)**(1/2)) / (2*a)
    x_2 = (- b-(b**2-4*a*c)**(1/2)) / (2*a)
    return x_1, x_2

تعليقات مضمنة Inline Comments

تشرح التعليقات المضمنة عبارة واحدة في جزء من الشفرة. من المفيد تذكيرك ، أو شرح للآخرين ، لماذا يلزم وجود سطر معين من التعليمات البرمجية. إليك ما يقوله PEP 8 عنهم:
  • لا تبالغ في استخدام التعليقات المضمنة, استخدمها باعتدال.
  • اكتب التعليقات المضمنة على نفس السطر الذي تشير إليه العبارة المراد ايضاحها.
  • تعليقات مضمنة منفصلة بمساحات أو أكثر من العبارات Statements.
  • ابدأ التعليقات المضمنة # بمساحة واحدة ، مثل تعليقات الحظر.
  • لا تستخدمها لشرح ما هو بديهي.
في ما يلي مثال على تعليق مضمّن:

x  =  5   # هذا تعليق داخلي

وأخيرًا ، فإن التعليقات المضمنة مثل هذه هي ممارسة سيئة حيث إنها تُظهر رمزًا واضحًا وفوضويًا:

empty_list = []  # Initialize empty list
x = 5
x = x * 5  # Multiply x by 5
التعليقات المضمنية أكثر تحديدًا من تعليقات Block ، ومن السهل إضافتها ,وعندما لا تكون ضرورية سيؤدي إلى فوضى. 
يمكنك أن تستغني عن استخدام تعليقات Block ، إلا إذا كنت متأكدًا من أنك تحتاج إلى تعليق ضمني.

سلاسل التوثيق Documentation Strings

سلاسل الوثائق أو docstrings ، هي سلاسل محاطة بعلامات اقتباس مزدوجة ( """) أو مفردة ( ''') تظهر في السطر الأول من أي دالة أو فئة أو طريقة أو وحدة نمطية. يمكنك استخدامها لشرح كتلة معينة من التعليمات البرمجية وتوثيقها. هناك PEP كامل ، PEP 257 ، الذي يغطي وثيقة ، ولكنك ستحصل على ملخص في هذا القسم.

أهم القواعد المطبقة على المستندات هي ما يلي:
  • تحيط بثلاث علامات اقتباس مزدوجة على جانبيها ، كما هو الحال في """This is a docstring""".
  • اكتبها لجميع الوحدات العامة والوظائف والطرق.
  • ضع """ تلك النهاية docstring متعدد الأسطر على سطر بنفسها:

def quadratic(a, b, c, x):
    """Solve quadratic equation via the quadratic formula.
    A quadratic equation has the following form:
    ax**2 + bx + c = 0
    There always two solutions to a quadratic equation: x_1 & x_2.
    """
    x_1 = (- b+(b**2-4*a*c)**(1/2)) / (2*a)
    x_2 = (- b-(b**2-4*a*c)**(1/2)) / (2*a)
    return x_1, x_2
بالنسبة لوثائق docstring المكونة من سطر واحد ، ضع العلامة """على نفس السطر:
def quadratic(a, b, c, x):
    """Use the quadratic formula"""
    x_1 = (- b+(b**2-4*a*c)**(1/2)) / (2*a)
    x_2 = (- b-(b**2-4*a*c)**(1/2)) / (2*a)
    return x_1, x_2

الفراغ في التعبيرات والبيانات

"متفرق هو أفضل من كثيف".
يمكن أن تكون المسافة البيضاء مفيدة جدًا في التعبيرات والعبارات عند استخدامها بشكل صحيح. إذا لم يكن هناك مساحة بيضاء كافية ، فقد يكون من الصعب قراءة الكود ،  إذا كان هناك الكثير من المسافات البيضاء ، فقد يكون من الصعب الجمع بين المصطلحات ذات الصلة بشكل مرئي في العبارة.

المسافات والمعاملات المنطقية

يجب احاطة المعاملات بمسافة واحدة على كلا الجانبين:
  • معاملات الاسناد ( =، +=، -=، الخ)
  • المقارنات ( ==، !=، >، <. >=، <=) و ( is، is not، in، not in)
  • العبارة البوليانية ( and، not، or)
استثناء : عندما تستخدم =  لاسناد قيمة افتراضية لدالة ، لا تحيطها بمسافات.
# مستحسن
def function(default_parameter=5):
    # ...

# غير مستحسن
def function(default_parameter = 5):
    # ...
عندما يكون هناك أكثر من معامل Operator  واحد في الكود ، فإن إضافة مسافة واحدة قبل وبعد كل معامل يمكن أن تبدو مربكة. بدلاً من ذلك ، من الأفضل فقط إضافة مسافة بيضاء حول العوامل ذات الأولوية الأقل ، خاصة في كتابة العبارات الرياضية performing mathematical manipulation. وهنا بضعة أمثلة:
# مستحسن
y = x**2 + 5
z = (x+y) * (x-y)

# غير مستحسن
y = x ** 2 + 5
z = (x + y) * (x - y)
يمكنك أيضًا تطبيق ذلك على العبارات التي توجد بها عدة شروط:
# غير مستحسن
if x > 5 and x % 2 == 0:
    print('x is larger than 5 and divisible by 2!')
في المثال أعلاه ، يكون المعامل and  أدنى أولوية. لذلك قد يكون من الواضح التعبير عن العبارة if على النحو التالي:
# مستحسن
if x>5 and x%2==0:
    print('x is larger than 5 and divisible by 2!')
أنت حر في اختيار ما هو أكثر وضوحا ، مع التحذير أنه يجب عليك استخدام نفس القدر من الفراغ على جانبي المعامل.
ما يلي غير مقبول:
# لا تستخدمها ابدا
if x >5 and x% 2== 0:
    print('x is larger than 5 and divisible by 2!')

متى يجب تجنب الفراغ

في بعض الحالات ، يمكن أن يؤدي إضافة مسافة بيضاء إلى جعل التعليمات البرمجية أكثر صعوبة في القراءة. 
الكثير من المسافات البيضاء يمكن أن تجعل الكود متفرقا بشكل مفرط ويصعب متابعته.
إن أهم مكان لتجنب إضافة المسافات البيضاء هو في نهاية السطر. هذا هو المعروف باسم زائدة بيضاء trailing whitespace . وهو غير مرئي ويمكن أن ينتج  عنه أخطاء يصعب تتبعها.
بعض الحالات التي يجب تجنب إضافة المسافات البيضاء إليها:
# مستحسن
my_list = [1, 2, 3]
# غير مستحسن
my_list = [ 1, 2, 3, ]
قبل الفاصلة أو الفاصلة المنقوطة أو النقطتين:
x = 5
y = 6
# مستحسن
print(x, y)
# غير مستحسن
print(x , y)
قبل أقواس الفتح  :
def  double ( x ):
    return  x  *  2
# مستحسن
double ( 3 )
# غير مستحسن
double  ( 3 )
قبل العارضة المفتوحة التي تبدأ القائمة او القاموس:
# مستحسن
list[3]
# غير مستحسن
list [3]
بين فاصلة زائدة وقوس إغلاق:
# مستحسن
tuple = (1,)
# غير مستحسن
tuple = (1, )
لمحاذاة عوامل التعيين:
# مستحسن
var1 = 5
var2 = 6
some_long_var = 7
# غير مستحسن
var1          = 5
var2          = 6
some_long_var = 7

توصيات وممارسات في البرمجة

"البسيط أفضل من المركب"

ستجد في كثير من الأحيان أن هناك عدة طرق لتنفيذ إجراء مشابه في Python (وأي لغة برمجة أخرى). في هذا القسم ، سترى بعض الاقتراحات التي يقدمها PEP 8 لإزالة هذا الغموض والحفاظ على التناسق.
#  غير مستحسن
my_bool = 6 > 5
if my_bool == True:
    return '6 is bigger than 5'
استخدام معامل التكافؤ ، ==، غير ضروري هنا. bool يمكن أن تأخذ فقط القيم Trueأو False. يكفي أن يكتب ما يلي:
# مستحسن
if my_bool:
    return '6 is bigger than 5'
إذا كنت تريد التحقق مما إذا كانت القائمة فارغة أم لا ، فقد يكون من المفيد التحقق من طول القائمة len. إذا كانت القائمة فارغة ، فسيكون طولها مساويًا 0 وتعني False لعبارة if. 
إليك مثال على ذلك:
# غير مستحسن
my_list = []
if not len(my_list):
    print('List is empty!')
يمكننا أن نأتي ببديل أبسط من ذلك
# مستحسن
my_list = []
if not my_list:
    print('List is empty!')
استخدام is not بدلا من not 
# مستحسن
if x is not None:
    return 'x exists!'

#  غير مستحسن
if not x is None:
    return 'x exists!'
كلا الخيارين صحيح ، إلا أن الخيار الأول يكون أبسط
في بعض الاحيان تحتاج للتحقق من ARG فتحتاج استخدام العبارة if x is not None f بجلا من استخدام if x:
# غير مستحسن
if  arg :
    # Do something with arg ...
# مستحسن
if arg is not None:
    # Do something with arg...
يجب عليك استخدام الكود الثاني والسبب أن التحقق بانه none أفضل من الكود الاول لان قيمة arg قيمتها الافتراضية none وهذا من الاخطاء الشائعة, لذلك يجب التحقق من انه ليس none وهذا هو الأصح.

هل استخدام العبارة startswith() أفضل أو العبارة .endswith() ولكن عن طريق الشرائح slice للقائمة
# غير مستحسن
if word[:3] == 'cat':
    print('The word starts with "cat"')

# مستحسن
if word.startswith('cat'):
    print('The word starts with "cat"')
الكودا الاول غير مستحسن لأنه غير قابل للقراءة.
ينطبق المبدأ نفسه عند التحقق من اللواحق. يوضح المثال أدناه كيفية التحقق مما إذا كانت السلسلة تنتهي بـ jpg:
# غير مستحسن
if file_name[-3:] == 'jpg':
    print('The file is a JPEG')

# مستحسنif file_name.endswith('jpg'):    print('The file is a JPEG')
كما هو الحال مع معظم توصيات البرمجة هذه ، فإن الهدف المنشود هو سهولة القراءة والبساطة. 
في بيثون، هناك العديد من الطرق المختلفة لتنفيذ نفس الإجراء ، لذلك من المفيد اتباع إرشادات حول الأساليب التي يجب اختيارها.

أنت الآن على دراية بكيفية كتابة كود بايثون نظيف وعالي الجودة وقابل للقراءة باستخدام المبادئ التوجيهية المنصوص عليها في PEP 8. في حين أن الإرشادات يمكن أن تبدو متحركة ، يمكن أن يؤدي اتباعها إلى تحسين شفرتك، خاصة عندما يتعلق الأمر بمشاركة الشفرة المصدرية لمشروعك مع فريق العمل الخاص بك أو المتعاونين.