البرمجة البايثونية - كيف تكتب شيفرة برمجية بالبايثون بطريقة سليمة

البرمجة البايثونية – كيف تكتب شيفرة برمجية بالبايثون بطريقة سليمة

البرمجة بطريقة بايثونية Pythonic Way هو مصطلح يُشير إلى طريقة كتابة الشيفرة البرمجية بالبايثون وفق مجموعة من الشروط والقيود التي يُنصح بها من قبل التوثيق الرسمي للبايثون ومن قبل مجتمع محترفي البرمجة بالبايثون. أهلا بكم في بايثونات في هذا المقال الجديد الذي نتناول فيه بعض من نصائح Python’s Style Guide والذي يُعرف اختصارًا بـ PEP 8.

البرمجة وفق معايير PEP

نجد من خلال موقع بايثون ما يُسمى بمقترحات تحسين البايثون Python Enhancement Proposals والتي يُشار لها باختصار PEP. كل مقترح موجود في القائمة  له رقم معين، ويتم إلحاقه برمز PEP مثل PEP 1 و PEP 4 و PEP 8. المقترح عبارة عن مستند يتم تقديمه لمجتمع بايثون ويحتوي إما على معلومات خاصة حول موضوع في البايثون، أو على وصف لخاصية جديدة في لغة البايثون أو على شروط وقيود يجب اتباعها. تُعتبر مستندات PEP الآلية الرسمية المتبعة من قبل مؤسسة بايثون لإضافة الخصائص والتطويرات الجديدة على اللغة.

لن نتكلم في هذا المقال عن أنواع PEP أو عن كيفية إنشاءها وآلية اعتمادها، إنما سنتكلم عن مقترح واحد وهو PEP 8.

PEP 8

مقترح PEP 8 عبارة عن مجموعة من المواثيق والأعراف الخاصة بطريقة كتابة الشيفرة البرمجية بالبايثون والمعتمدة في المكتبات المعيارية الموجودة في توزيعات بايثون المختلفة.

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

قواعد التسمية عند البرمجة بالبايثون

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

نجد في PEP 8 العديد من القواعد التي تحكم طريقة تسمية المتغيرات والدوال والفئات والمتغيرات الثابتة. نستعرض في الجدول التالي العديد من قواعد التسمية:

النوعطريقة الكتابةمثال
المتغيراتالأحرف الصغيرة والتسطير السُفلي لفصل الكلمات عن بعضها البعضv, age, car_size
الدوالالأحرف الصغيرة والتسطير السُفلي لفصل الكلمات عن بعضها البعضfun, my_function
الفئاتابدأ اسم الفئة بحرف كبير ولا تستخدم التسطير السفلي للفصل بين الكلماتPerson, EmailBrain
الثوابتاستخدم الأخرف الكبيرة في جميع الكلمة، مع التسطير السفلي للفصل بين الكلماتMAX_ALLOWED_USERS
دوال الفئاتالأحرف الصغيرة والتسطير السُفلي لفصل الكلمات عن بعضها البعضmethod, my_method
اسماء الملفالأحرف الصغيرة والتسطير السُفلي لفصل الكلمات عن بعضها البعضfile.py, email_file.py
الحِزمالأحرف الصغيرة بدون التسطير السفلي للفصل بين الكلماتpackage.py, mypackage.py

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

الهيكل العام للشيفرة في بايثون

الإزاحة الفارغة Identation

لا تعتمد لغة البرمجة البايثون على استخدام الأقواس المُزهرة Curly Braces في تحديد أجزاء الشيفرة البرمجية Block of Code، بل تعتمد على الإزاحة الفارغة (4 فراغات أو tab واحدة). من المهم جدًا الإنتباه لهذه النقطة لما تُسببه من ضياع وقت في معرفة لماذا لا يعمل الكود، بينما يكون الأمر في الحقيقة بسيطًا وهو عبارة عن إزاحة زائدة او ناقصة.

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

#الطريقة الصحيحة

foo = long_function_name(var_one, var_two,
                         var_three, var_four,
						 var_five, var_six)


foo = long_function_name(
    var_one, var_two,
    var_three, var_four,
	var_five, var_six)
#الطريقة الخاطئة

foo = long_function_name(var_one, var_two,
    var_three, var_four,
	var_five, var_six)

عندما يكون هناك سطر برمجي يلي قائمة العناصر، يجب تمميز قائمة العناصر عن السطر التالي باستخدام إزاحة اضافية كما يلي:

# الطريقة الصحيحة

def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)
# الطريقة الخاطئة

def long_function_name(
        var_one, var_two, var_three,
        var_four):
        print(var_one)

التراكيب التي تحتوي مجموعة من العناصر مثل القائمة في الأمثلة السابقة، يُمكن اضافة قوس الإغلاق أسفل العنصر الأخير وبنفس الإزاحة كما يلي:

my_list = [
    1, 2, 3,
    4, 5, 6,
    ]
result = some_function_that_takes_arguments(
    'a', 'b', 'c',
    'd', 'e', 'f',
    )

أو يُمكن اضافة قوس الإغلاق في أول السطر التالي لآخر عنصر وبدون إزاحة:

my_list = [
    1, 2, 3,
    4, 5, 6,
]
result = some_function_that_takes_arguments(
    'a', 'b', 'c',
    'd', 'e', 'f',
)

4 فراغات ام tab أثناء البرمجة ؟

ينصح موقع بايثون باستخدام الفراغات spaces بدلًا من tab. يتم استخدام tab في الشيفرة البرمجية التي سبق اعتماد tab فيها. يمنع الإصدار الثالث من البايثون من الجمع بين الخيارين أثناء البرمجة بالبايثون.

أقصى عدد أحرف في السطر البرمجي

ينصح الخُبراء في PEP 8 بأن لا يزيد عدد الأحرف في السطر البرمجي الواحد عن 79 حرف، حيث إن أغلب المحررات البرمجية تقوم بفصل السطر البرمجي لكل 80 حرف. هذه التوصية تُساعد أيضًا في حالة فتح أكثر من ملف عند إجراء عملية مقارنة أكثر من ملف برمجي ومراجعة الشيفرة البرمجية code review.

العمليات الرياضية وفصل الأسطر

في بعض الأحيان نكتب أسطر برمجية طويلة تتضمن عمليات رياضية مثل الجمع او الطرح. يُنصح عند فصل السطر البرمجي الطويل الذي يحتوي عمليات رياضية، بأن يبدأ السطر الجديد بالعملية الرياضية وليس أن ينتهي بها، لأن ذلك أفضل للعين وأنسب للقراء والفهم بطريقة صحيحة:

# الطريقة الصحيحة

income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)
# الطريقة الخاطئة

income = (gross_wages +
          taxable_interest +
          (dividends - qualified_dividends) -
          ira_deduction -
          student_loan_interest)

استيراد المكتبات والحِزم

تُكتب الأسطر البرمجية الخاصة باستيراد المكتبات في بداية الملف، بعد التوثيق ان وجد، وقبل تعريف المتغيرات والثوابت العامة في الملف. يتم تقسيم الإستيراد إلى ثلاثة مجموعات بالترتيب كما يلي، ويفصل بين كل مجموعة سطر فارغ:

  • استيراد المكتبات المعيارية
  • استيراد المكتبات الخارجية (طرف ثالث)
  • استيراد المكتبات المحلية/الخاصة بالتطبيق

يتم استيراد كل مكتية في سطر خاص:

#الطريقة الصحيحة 

import os
import sys

from subprocess import Popen, PIPE
#الطريقة الخاطئة

import sys, os

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

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *