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

البرمجة بطريقة بايثونية 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 العديد من القواعد التي تحكم طريقة تسمية المتغيرات والدوال والفئات والمتغيرات الثابتة. نستعرض في الجدول التالي العديد من قواعد التسمية:
[spbtbl_sc id=14]
إلتزامك بقواعد التسمية السابقة يُحدد مدى سهولة قراءة وفهم شيفرتك البرمجية عندما يقرؤها الآخرون، وبالطبع فإن القواعد السابقة اضافة بسيطة ولكن لها أثر كبير للغاية.
الهيكل العام للشيفرة في بايثون
الإزاحة الفارغة Identation
لا تعتمد لغة البرمجة البايثون على استخدام الأقواس المُزهرة Curly Braces في تحديد أجزاء الشيفرة البرمجية Block of Code، بل تعتمد على الإزاحة الفارغة (4 فراغات أو tab واحدة). من المهم جدًا الإنتباه لهذه النقطة لما تُسببه من ضياع وقت في معرفة لماذا لا يعمل الكود، بينما يكون الأمر في الحقيقة بسيطًا وهو عبارة عن إزاحة زائدة او ناقصة.
عند كتابة مجموعة من عناصر قائمة في البايثون، يجب أن تكون العناصر مُرتبة فوق بعضها البعض عموديًا، وذلك عند فتح سطر جديد، وذلك باستخدام الإزاحة الفارغة. انظر المثال التالي:
[pastacode lang=”python” manual=”%23%D8%A7%D9%84%D8%B7%D8%B1%D9%8A%D9%82%D8%A9%20%D8%A7%D9%84%D8%B5%D8%AD%D9%8A%D8%AD%D8%A9%0A%0Afoo%20%3D%20long_function_name(var_one%2C%20var_two%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var_three%2C%20var_four%2C%0A%09%09%09%09%09%09%20var_five%2C%20var_six)%0A%0A%0Afoo%20%3D%20long_function_name(%0A%20%20%20%20var_one%2C%20var_two%2C%0A%20%20%20%20var_three%2C%20var_four%2C%0A%09var_five%2C%20var_six)” message=”” highlight=”” provider=”manual”/]
[pastacode lang=”python” manual=”%23%D8%A7%D9%84%D8%B7%D8%B1%D9%8A%D9%82%D8%A9%20%D8%A7%D9%84%D8%AE%D8%A7%D8%B7%D8%A6%D8%A9%0A%0Afoo%20%3D%20long_function_name(var_one%2C%20var_two%2C%0A%20%20%20%20var_three%2C%20var_four%2C%0A%09var_five%2C%20var_six)” message=”” highlight=”” provider=”manual”/]
عندما يكون هناك سطر برمجي يلي قائمة العناصر، يجب تمميز قائمة العناصر عن السطر التالي باستخدام إزاحة اضافية كما يلي:
[pastacode lang=”python” manual=”%23%20%D8%A7%D9%84%D8%B7%D8%B1%D9%8A%D9%82%D8%A9%20%D8%A7%D9%84%D8%B5%D8%AD%D9%8A%D8%AD%D8%A9%0A%0Adef%20long_function_name(%0A%20%20%20%20%20%20%20%20var_one%2C%20var_two%2C%20var_three%2C%0A%20%20%20%20%20%20%20%20var_four)%3A%0A%20%20%20%20print(var_one)” message=”” highlight=”” provider=”manual”/]
[pastacode lang=”python” manual=”%23%20%D8%A7%D9%84%D8%B7%D8%B1%D9%8A%D9%82%D8%A9%20%D8%A7%D9%84%D8%AE%D8%A7%D8%B7%D8%A6%D8%A9%0A%0Adef%20long_function_name(%0A%20%20%20%20%20%20%20%20var_one%2C%20var_two%2C%20var_three%2C%0A%20%20%20%20%20%20%20%20var_four)%3A%0A%20%20%20%20%20%20%20%20print(var_one)” message=”” highlight=”” provider=”manual”/]
التراكيب التي تحتوي مجموعة من العناصر مثل القائمة في الأمثلة السابقة، يُمكن اضافة قوس الإغلاق أسفل العنصر الأخير وبنفس الإزاحة كما يلي:
[pastacode lang=”python” manual=”my_list%20%3D%20%5B%0A%20%20%20%201%2C%202%2C%203%2C%0A%20%20%20%204%2C%205%2C%206%2C%0A%20%20%20%20%5D%0Aresult%20%3D%20some_function_that_takes_arguments(%0A%20%20%20%20’a’%2C%20’b’%2C%20’c’%2C%0A%20%20%20%20’d’%2C%20’e’%2C%20’f’%2C%0A%20%20%20%20)” message=”” highlight=”” provider=”manual”/]
أو يُمكن اضافة قوس الإغلاق في أول السطر التالي لآخر عنصر وبدون إزاحة:
[pastacode lang=”python” manual=”my_list%20%3D%20%5B%0A%20%20%20%201%2C%202%2C%203%2C%0A%20%20%20%204%2C%205%2C%206%2C%0A%5D%0Aresult%20%3D%20some_function_that_takes_arguments(%0A%20%20%20%20’a’%2C%20’b’%2C%20’c’%2C%0A%20%20%20%20’d’%2C%20’e’%2C%20’f’%2C%0A)” message=”” highlight=”” provider=”manual”/]
4 فراغات ام tab أثناء البرمجة ؟
ينصح موقع بايثون باستخدام الفراغات spaces بدلًا من tab. يتم استخدام tab في الشيفرة البرمجية التي سبق اعتماد tab فيها. يمنع الإصدار الثالث من البايثون من الجمع بين الخيارين أثناء البرمجة بالبايثون.
أقصى عدد أحرف في السطر البرمجي
ينصح الخُبراء في PEP 8 بأن لا يزيد عدد الأحرف في السطر البرمجي الواحد عن 79 حرف، حيث إن أغلب المحررات البرمجية تقوم بفصل السطر البرمجي لكل 80 حرف. هذه التوصية تُساعد أيضًا في حالة فتح أكثر من ملف عند إجراء عملية مقارنة أكثر من ملف برمجي ومراجعة الشيفرة البرمجية code review.
العمليات الرياضية وفصل الأسطر
في بعض الأحيان نكتب أسطر برمجية طويلة تتضمن عمليات رياضية مثل الجمع او الطرح. يُنصح عند فصل السطر البرمجي الطويل الذي يحتوي عمليات رياضية، بأن يبدأ السطر الجديد بالعملية الرياضية وليس أن ينتهي بها، لأن ذلك أفضل للعين وأنسب للقراء والفهم بطريقة صحيحة:
[pastacode lang=”python” manual=”%23%20%D8%A7%D9%84%D8%B7%D8%B1%D9%8A%D9%82%D8%A9%20%D8%A7%D9%84%D8%B5%D8%AD%D9%8A%D8%AD%D8%A9%0A%0Aincome%20%3D%20(gross_wages%0A%20%20%20%20%20%20%20%20%20%20%2B%20taxable_interest%0A%20%20%20%20%20%20%20%20%20%20%2B%20(dividends%20-%20qualified_dividends)%0A%20%20%20%20%20%20%20%20%20%20-%20ira_deduction%0A%20%20%20%20%20%20%20%20%20%20-%20student_loan_interest)” message=”” highlight=”” provider=”manual”/]
[pastacode lang=”python” manual=”%23%20%D8%A7%D9%84%D8%B7%D8%B1%D9%8A%D9%82%D8%A9%20%D8%A7%D9%84%D8%AE%D8%A7%D8%B7%D8%A6%D8%A9%0A%0Aincome%20%3D%20(gross_wages%20%2B%0A%20%20%20%20%20%20%20%20%20%20taxable_interest%20%2B%0A%20%20%20%20%20%20%20%20%20%20(dividends%20-%20qualified_dividends)%20-%0A%20%20%20%20%20%20%20%20%20%20ira_deduction%20-%0A%20%20%20%20%20%20%20%20%20%20student_loan_interest)” message=”” highlight=”” provider=”manual”/]
استيراد المكتبات والحِزم
تُكتب الأسطر البرمجية الخاصة باستيراد المكتبات في بداية الملف، بعد التوثيق ان وجد، وقبل تعريف المتغيرات والثوابت العامة في الملف. يتم تقسيم الإستيراد إلى ثلاثة مجموعات بالترتيب كما يلي، ويفصل بين كل مجموعة سطر فارغ:
- استيراد المكتبات المعيارية
- استيراد المكتبات الخارجية (طرف ثالث)
- استيراد المكتبات المحلية/الخاصة بالتطبيق
يتم استيراد كل مكتية في سطر خاص:
[pastacode lang=”python” manual=”%23%D8%A7%D9%84%D8%B7%D8%B1%D9%8A%D9%82%D8%A9%20%D8%A7%D9%84%D8%B5%D8%AD%D9%8A%D8%AD%D8%A9%20%0A%0Aimport%20os%0Aimport%20sys%0A%0Afrom%20subprocess%20import%20Popen%2C%20PIPE” message=”” highlight=”” provider=”manual”/]
[pastacode lang=”python” manual=”%23%D8%A7%D9%84%D8%B7%D8%B1%D9%8A%D9%82%D8%A9%20%D8%A7%D9%84%D8%AE%D8%A7%D8%B7%D8%A6%D8%A9%0A%0Aimport%20sys%2C%20os” message=”” highlight=”” provider=”manual”/]
إلى هنا نكون استكملنا مجموعة من النصائح وأفضل الممارسات المستخدمة في كتابة الشيفرة البرمجية بالبايثون. يُسعدنا مشكاركتكم هذا المقال لتعم الفائدة.
مقالات مشابهة
7 طرق عليك تعلمها لتحسين اختبار البرمجيات
المزخرفات في بايثون – كيف نتعامل مع دوال بايثون بحُرية أكثر
البرمجة الكائنية في بايثون – سلسلة بايثونات لتعلم لغة البايثون
معالجة الأخطاء في بايثون – سلسلة بايثونات لتعلم لغة البايثون