يتضمن تصحيح أخطاء بايثون تحديد الأخطاء في التعليمات البرمجية وإصلاحها باستخدام أدوات مثل تتبع الأخطاء، واستدعاءات ()print، ونقاط التوقف، والاختبارات. في هذا الدرس، ستتعلم كيفية تفسير رسائل الخطأ، واستخدام ()print لتتبع قيم المتغيرات، وتعيين نقاط توقف لإيقاف التنفيذ مؤقتًا وفحص سلوك التعليمات البرمجية. ستتعرف أيضًا على كيفية كتابة الاختبارات للمساعدة في منع الأخطاء وضمان تشغيل التعليمات البرمجية كما هو متوقع.
إن فهم تقنيات تصحيح الأخطاء هذه سيمكنك من التعامل مع أخطاء بايثون بثقة والحفاظ على كفاءة الكود.
كيفية البدء في تصحيح الأخطاء في بايثون
تصحيح الأخطاء يعني كشف ما هو مخفي أحيانًا. إنها عملية تحديد وتحليل وحل المشكلات أو الأخطاء أو العيوب في التعليمات البرمجية.
في جوهرها، تتضمن عملية تصحيح الأخطاء فحص الكود بشكل منهجي لتحديد السبب الجذري للمشكلة، ثم تطبيق الحلول لضمان عمل البرنامج كما هو مُخطط له. تُعدّ عملية تصحيح الأخطاء مهارة أساسية يجب عليك تطويرها.
غالبًا ما تتضمن عملية تصحيح الأخطاء استخدام أدوات وتقنيات مثل نقاط التوقف، والتسجيل، والاختبارات لتحقيق أداء مثالي وخالٍ من الأخطاء لبرنامجك. بعبارة أبسط، تصحيح الأخطاء هو البحث في التعليمات البرمجية ورسائل الخطأ لمحاولة تحديد مصدر المشكلة، ثم إيجاد حل لها.
لنفترض أن لديك الكود التالي:
print(cat)
الكود الذي يطبع قيمة المتغير cat محفوظ في ملف باسم cat.py. إذا حاولت تشغيل الملف، فستحصل على خطأ تتبع الأخطاء يفيد بأنه لا يمكن العثور على تعريف المتغير المسمى cat.
$ python cat.py
Traceback (most recent call last):
File "/path_to_your_file/cat.py", line 1, in <module>
print(cat)
^^^
NameError: name 'cat' is not defined
عندما يواجه بايثون خطأً أثناء التنفيذ، فإنه يطبع تتبع الأخطاء، وهو رسالة مفصلة توضح مكان حدوث المشكلة في الكود. في هذا المثال، لا يمكن العثور على المتغير المسمى cat لأنه لم يتم تعريفه.
إليك ما يعنيه كل جزء من أجزاء تتبع الأخطاء في بايثون:
| الجزء | الشرح |
|---|---|
Traceback (most recent call last) | رسالة عامة يرسلها بايثون لإعلامك بوجود مشكلة في التعليمات البرمجية. |
File "/path_to_your_file/cat.py" | يشير هذا إلى الملف الذي نشأ منه الخطأ. |
line 1, in <module> | يخبرك هذا الأمر بالسطر المحدد في الملف الذي حدث فيه الخطأ. |
print(cat) | يعرض لك سطر كود بايثون الذي تسبب في الخطأ. |
NameError | يُخبرك بنوع الخطأ. في هذا المثال، لديك خطأ في الاسم (NameError). |
name 'cat' is not defined | هذه هي رسالة الخطأ المحددة التي تخبرك بمزيد من التفاصيل حول الخطأ في جزء الكود. |
في هذا المثال، لا يستطيع مفسر بايثون العثور على أي تعريف مُسبق للمتغير cat، وبالتالي لا يُمكنه توفير قيمة عند استدعاء الدالة print(cat). هذا خطأ شائع في بايثون قد يحدث عند نسيان تعريف المتغيرات بقيم ابتدائية.
لإصلاح هذا الخطأ، ستحتاج إلى اتباع نهج خطوة بخطوة من خلال قراءة رسالة الخطأ، وتحديد المشكلة، واختبار الحلول حتى تجد حلاً يعمل.
في هذه الحالة، يتمثل الحل في إسناد قيمة للمتغير cat قبل استدعاء دالة الطباعة. إليك مثال:
cat = "Siamese"
print(cat)
لاحظ أن رسالة الخطأ تختفي عند إعادة تشغيل البرنامج، ويتم طباعة المخرجات التالية:
$ python cat.py
Siamese
يتم طباعة النص المخزن في الدالة cat كناتج للبرنامج. بحل هذا الخطأ، تكون قد قطعت شوطًا كبيرًا نحو تصحيح الأخطاء في بايثون بسرعة.
في الأقسام التالية، ستستكشف طرقًا أخرى لتصحيح الأخطاء، ولكن أولًا، ستلقي نظرة فاحصة على استخدام تتبع الأخطاء.
كيفية تصحيح أخطاء بايثون باستخدام تتبع الأخطاء
كما رأيتَ سابقًا، يُعدّ تصحيح الأخطاء باستخدام تتبع الأخطاء أحد طرق حلّها في التعليمات البرمجية. لاستخدام تتبع الأخطاء، يجب أن تكون قادرًا على فهم ومعالجة كل سطر منه، وهذا لا يتأتّى إلا بفهمه فهمًا كاملًا.
فهم عمليات التتبع
يُطلق مصطلح “تتبع الأخطاء” على الرسالة التي تظهر على الشاشة عند حدوث خطأ. وبحسب نوع الخطأ ومصدره، قد يكون تتبع الأخطاء بضعة أسطر فقط أو يمتد على عدة أسطر.
في المثال أدناه، تريد جمع رقمين ولكنك نسيت تحويل كليهما إلى أعداد صحيحة، لذلك هناك محاولة لجمع سلسلة نصية وعدد صحيح:
>>> total = 23 + "3"
Traceback (most recent call last):
File "python-input-0", line 1, in <module>
total = 23 + "3"
~~~^~~~~
TypeError: unsupported operand type(s) for +: 'int' and 'str'
بالنظر إلى تتبع الأخطاء أعلاه، يمكنك رؤية الكود الخاص بك مطبوعًا على الشاشة، مع وضع رمز الإقحام (^) أسفل عامل الجمع. يشير هذا الرمز إلى الموضع الذي يكتشف فيه المفسر المشكلة.
عند تشغيل الكود، يواجه المفسر عامل الجمع بين عدد صحيح وسلسلة نصية. لا يمكن جمع هذين النوعين معًا في بايثون، لذا يُصدر المفسر خطأً من نوع TypeError.
تصحيح الأخطاء باستخدام تتبع الأخطاء
لتصحيح الأخطاء باستخدام تتبع الأخطاء، من المهم قراءة كل سطر من سجل تتبع الأخطاء بعناية لفهم مصدر المشكلة وتحديده. في تتبع الأخطاء أعلاه، يشير بايثون إلى السطر 1 كمصدر للخطأ.
في قاعدة بيانات الملف، انتقل إلى السطر الذي تم تحديده وقم بمقارنته بالرسالة اللاحقة في تتبع الأخطاء لفهم الخطأ بشكل أفضل.
يمكنك المضي قدمًا وحل الخطأ عن طريق تحويل السلسلة إلى عدد صحيح، أو في هذه الحالة، عن طريق تغيير السلسلة “3” إلى العدد الصحيح 3:
>>> total = 23 + 3
>>> total
26
في هذه النسخة المصححة، يؤدي تغيير نوع الرقم “3” من سلسلة نصية إلى عدد صحيح إلى حل المشكلة. إذا كانت السلسلة النصية مخزنة في متغير، فيمكنك استخدام الدالة ()int لتحويلها إلى عدد صحيح.
من المهم ملاحظة أنه في بعض الأحيان، وبحسب سبب الخلل، قد يكون ناتج الخطأ خطأً في بناء الجملة لا يتضمن الكلمة المفتاحية Traceback المعتادة. على سبيل المثال، يحاول الكود أدناه جمع عددين صحيحين ولكنه يحذف عامل الجمع، مما ينتج عنه خطأ في بناء الجملة (SyntaxError).
>>> total = 23 3
File "<python-input-0>", line 1
total = 23 3
^
SyntaxError: invalid syntax
لاحظ أن سجل الأخطاء مشابه لتتبع الأخطاء، لكنه يختلف قليلاً في بنيته. وينطبق نفس النهج التدريجي الذي استخدمته لفك تشفير تتبع الأخطاء عند التعامل مع أخطاء بناء الجملة.
كيفية تصحيح أخطاء بايثون باستخدام دالة ()print
عند تصحيح الأخطاء باستخدام دالة ()print، يكون هدفك هو طباعة التعليقات أو التعبيرات أو قيم المتغيرات في نقاط متعددة من الكود حتى تحدد السطر الذي يحتوي على الخطأ. يمكنك أيضًا استخدامها لتتبع المتغيرات وقيمها أثناء انتقالها وتغيرها في قاعدة الكود. هذه الطريقة هي نسخة مبسطة من تقنية التسجيل الأكثر تقدمًا.
فهم عملية تصحيح الأخطاء باستخدام دالة ()print
على الرغم من أنك ربما تكون على دراية بالفعل بدالة ()print المدمجة في بايثون، إلا أنه يجدر إلقاء نظرة فاحصة على كيفية استخدامها بشكل استراتيجي لتصحيح أخطاء التعليمات البرمجية الخاصة بك.
الدالة ()print هي دالة مدمجة تأخذ الأعداد الصحيحة والسلاسل والصفوف والقوائم والكائنات الأخرى، وتطبعها إلى الإخراج القياسي – عادةً ما يكون الطرفية التي تقوم بتشغيل مشروعك عليها.
في معظم الحالات، يُستخدم هذا الأسلوب لعرض المخرجات في الطرفية عندما تكون غير متأكد من قيمة متغير معين. بهذه الطريقة، يمكنك التحقق من أن حالة الكود هي ما تريده بالضبط في تلك اللحظة. يمكنك استخدام الأسلوب نفسه عند تصحيح الأخطاء.
تصحيح الأخطاء باستخدام دالة الطباعة
في المثال التالي، لديك دالة تتحقق من الكلمات المتناظرة – وهي الكلمات التي تُقرأ بنفس الطريقة من الأمام والخلف:
>>> def find_palindromes(text):
... words = text.split()
... return [word for word in words if word == word[::-1]]
...
>>> find_palindromes("Dad plays many solos at noon, and sees a racecar.")
['solos', 'sees', 'a']
لا تعثر الدالة على جميع الكلمات المتناظرة التي من المفترض أن تُرجعها. في هذه الحالة، لم تعثر على كلمات Dad وnoon وracecar. هناك سببان لذلك: لم تعثر على كلمة Dad بسبب اختلاف حالة الأحرف، بينما لم تعثر على كلمتي noon وracecar بسبب اختلاف علامات الترقيم. إليك كيفية تصحيح أخطاء الدالة باستخدام()print:
- اطبع قائمة
wordsالناتجة عن تقسيم النص للتحقق من وجود مشكلة في علامات الترقيم أو حساسية حالة الأحرف. سيكشف هذا عن وجود علامات ترقيم متبقية في بعض الكلمات، مما يستدعي تنقيحها. - اطبع جميع الكلمات بعد تنظيفها – أي بعد تحويلها إلى أحرف صغيرة وإزالة الأحرف غير الأبجدية الرقمية.
- اطبع قائمة الكلمات التي يتم فحصها بحثًا عن الكلمات المتناظرة للتأكد من عدم وجود أي تطابقات مفقودة.
إليكم الكود المحدث مع إضافة استدعاءات ()print:
>>> def find_palindromes(text):
... words = text.split()
... print(f"{words = }")
... # Remove punctuation and convert to lowercase
... normalized_words = [
... "".join(filter(str.isalnum, word)).lower()
... for word in words
... ]
... print(f"{normalized_words = }")
... palindromes = [
... word for word in normalized_words if word == word[::-1]
... ]
... print(f"{palindromes = }")
... return palindromes
...
>>> find_palindromes("Dad plays many solos at noon, and sees a racecar.")
words = ['Dad', 'plays', 'many', 'solos', (...), 'sees', 'a', 'racecar.']
normalized_words = ['dad', 'plays', 'many', (...), 'sees', 'a', 'racecar']
palindromes = ['dad', 'solos', 'noon', 'sees', 'a', 'racecar']
['dad', 'solos', 'noon', 'sees', 'a', 'racecar']
في هذا المثال، تُظهر استدعاءات الدالة ()print في الأسطر المظللة قيم القائمة في كل خطوة من خطوات التحقق من التناظر. لاحظ كيف تستفيد من خاصية التوثيق الذاتي ل f-strings لعرض أسماء المتغيرات المقابلة. لتحسين التنسيق، خاصةً عند التعامل مع قوائم تمتد على عدة أسطر، يمكنك استبدال ()print بـ ()pprint لعرض البيانات بطريقة أكثر وضوحًا.
تضمن إضافة دالة ()filter للأحرف والأرقام إزالة جميع السمات غير الأبجدية الرقمية من كل كلمة. كما أن تضمين دالة ()lower يحول جميع السلاسل النصية إلى أحرف صغيرة لضمان اتساق المقارنات.
لا تنس إزالة استدعاءات ()print بعد حل الأخطاء، على الرغم من أنه يمكنك دائمًا الاحتفاظ بها لأغراض التسجيل أو تصحيح الأخطاء في المستقبل.
كيفية تصحيح أخطاء بايثون باستخدام نقاط التوقف
على عكس دوال الطباعة ()print) التي تُقدم لك لقطات ثابتة لسلوك برنامجك، تتيح لك نقاط التوقف إيقاف تنفيذ البرنامج مؤقتًا واستكشافه بشكل تفاعلي أثناء تشغيله. يُمكّنك هذا من فحص المتغيرات أثناء تغيرها خطوة بخطوة وصولًا إلى نقطة التوقف.
في هذا القسم، ستتعرف على كيفية عمل نقاط التوقف وكيف يمكنك استخدامها لفحص الأخطاء وإصلاحها.
فهم نقاط التوقف
نقطة التوقف هي علامة أو أمر في التعليمات البرمجية يشير إلى برنامج تصحيح الأخطاء لإيقاف تنفيذ البرنامج مؤقتًا عند سطر معين. يتيح لك هذا فحص حالة البرنامج وسلوكه في تلك اللحظة.
بشكل افتراضي، يقوم المفسر بتنفيذ التعليمات البرمجية من الأعلى إلى الأسفل حتى يصل إلى نهاية الملف، أو يواجه خطأً، أو يصل إلى نقطة توقف. عندما يتوقف البرنامج عند نقطة التوقف، يمكنك تنفيذ جزء صغير من التعليمات البرمجية وتوسيع الأجزاء تدريجيًا حتى تجد سبب الخطأ.
في معظم محررات الأكواد التي تدعم تصحيح الأخطاء، مثل فيجوال ستوديو كود (VS Code) وPyCharm، تظهر نقاط التوقف كعلامات مرئية، عادةً ما تكون على شكل نقاط حمراء صغيرة بجانب أرقام الأسطر. يمكنك إضافة نقاط التوقف أو إزالتها ببساطة عن طريق النقر في الهامش الأيسر بجانب سطر الكود الذي تريد فحصه.
تصحيح الأخطاء باستخدام نقاط التوقف
عندما يصادف البرنامج نقطة توقف، يتولى برنامج تصحيح الأخطاء التحكم في تنفيذ البرنامج ويوقفه مؤقتًا عند السطر المحدد.
توفر أداة تصحيح الأخطاء أدوات وواجهة مستخدم تتيح لك التفاعل مع البرنامج المتوقف مؤقتًا. يمكنك فحص المتغيرات، وتتبع تنفيذ التعليمات البرمجية سطرًا بسطر، وفهم ما يفعله برنامجك بشكل أفضل.
في هذا المثال، ستستخدم برنامج VS Code لتصحيح أخطاء دالة تقوم بتحويل أسماء قائمة من الفواكه إلى أحرف كبيرة. من المهم التأكد من استخدام محرر أكواد يدعم نقاط التوقف.
أولاً، قم بتعريف دالة. في محرر الأكواد الخاص بك، أنشئ ملفًا باسم fruit.py، وأضف تعريف الدالة التالي:
def capitalize_fruit_names(fruits):
capitalized_fruit_names = []
for fruit in fruits:
capitalized_fruit_names.append(fruit.capitalize())
return capitalized_fruit_names
capitalize_fruit_names(["apple", "BANANA", 98, "Mango"])
بعد ذلك، ستقوم بتعيين نقطة توقف. حدد السطر داخل الدالة حيث تريد فحص عملية التنفيذ – في هذه الحالة، داخل حلقة التكرار. في محرر النصوص، انقر على الهامش الأيسر بجوار رقم السطر لتعيين نقطة التوقف. ستظهر نقطة حمراء.

لاحظ النقطة الحمراء بجانب السطر الخامس أعلاه. أنت الآن جاهز لبدء عملية تصحيح الأخطاء. في برنامج VS Code، انقر على أيقونة “التشغيل وتصحيح الأخطاء” في شريط الأنشطة الموجود على جانب النافذة. عند القيام بذلك، ستظهر لوحة تصحيح الأخطاء وستبدو مشابهة للصورة التالية:

استخدم أيقونات الأسهم لتصفح التعليمات البرمجية سطرًا بسطر، أو لتشغيل التعليمات البرمجية حتى نقطة التوقف التالية دون الدخول إلى استدعاءات الدوال. يمكنك أيضًا النقر على زر التشغيل المثلث لتشغيل البرنامج دون انقطاع.
في حال حدوث خطأ، ستظهر نافذة منبثقة تُشير إلى الخطأ أسفل السطر الذي يحتوي على المشكلة في محرر التعليمات البرمجية، مع تسليط الضوء على مكان الخطأ. كرر العملية، وقم بتصحيح التعليمات البرمجية، واستأنف التنفيذ حتى تتأكد من أن المتغيرات تعمل بالشكل المطلوب.
عند استخدام أداة نقاط التوقف، ستلاحظ ظهور خطأ عندما يحاول عدد صحيح إكمال عملية حلقة التكرار. يجب أن يرشدك هذا إلى إضافة شرط للتحقق من القيم واستبعاد القيم غير النصية من القائمة.
قم بتعديل الدالة ()capitalize_fruit_names بحيث تتعامل مع المدخلات غير النصية عن طريق استبدالها بسلاسل نصية فارغة.
def capitalize_fruit_names(fruits):
capitalized_fruit_names = []
cleaned = [fruit if isinstance(fruit, str) else "" for fruit in fruits]
for fruit in cleaned:
capitalized_fruit_names.append(fruit.capitalize())
return capitalized_fruit_names
تمت إعادة كتابة الدالة ()capitalize_fruit_names للتحقق مما إذا كانت قيمة الفاكهة من نوع سلسلة نصية، وإذا لم تكن كذلك، يتم استبدال القيمة غير النصية بسلسلة نصية فارغة (“”). الآن، قم بتشغيل مصحح الأخطاء مرة أخرى مع نقاط التوقف ولاحظ الفرق. لم يعد البرنامج يُظهر أي خطأ، وتعمل المتغيرات fruit و capitalized_fruit_names كما هو متوقع.
استخدام دالة ()breakpoint المدمجة في لغة بايثون
تُعدّ دالة ()breakpoint المدمجة في لغة بايثون وسيلة ملائمة لإضافة ميزات تصحيح الأخطاء إلى التعليمات البرمجية. وقد تم تقديمها في الإصدار 3.7 من بايثون، وهي دالة سهلة الاستخدام. عندما تصادف بايثون دالة ()breakpoint في التعليمات البرمجية، فإنها توقف التنفيذ مؤقتًا وتدخل في بيئة تصحيح أخطاء تفاعلية.
بشكل افتراضي، تستخدم الدالة breakpoint() مُصحح الأخطاء المدمج في بايثون، وهو pdb، ولكن يمكنك تهيئتها لاستخدام أدوات أخرى. لاستخدام الدالة breakpoint()، ما عليك سوى إضافة استدعاء الدالة في سطر جديد من التعليمات البرمجية حيث ترغب في إضافة نقطة التوقف. سيكون لهذا تأثير مشابه للنقر على الهامش الأيسر في برنامج VS Code.
كيفية تصحيح أخطاء بايثون باستخدام الاختبارات
هناك طريقة فعالة أخرى لتصحيح الأخطاء الشائعة في لغة بايثون وهي من خلال الاختبار.
كتابة الاختبارات قبل كتابة الدوال ستساعدك على اكتشاف الأخطاء مبكرًا. حتى إذا كان لديك خطأ بالفعل، فلا يزال بإمكانك كتابة اختبار باستخدام مدخلات محددة لاكتشاف مصدر المشكلة عندما لا تحصل على المخرجات المتوقعة.
في الأقسام التالية، ستتعرف على معنى الاختبار في سياق تصحيح الأخطاء وكيفية استخدامه لإصلاح الأخطاء في التعليمات البرمجية الخاصة بك.
فهم عملية تصحيح الأخطاء باستخدام الاختبارات
يعني استخدام الاختبارات لأغراض تصحيح الأخطاء كتابة وتشغيل أجزاء صغيرة ومحددة من التعليمات البرمجية تتحقق مما إذا كانت وظائف البرنامج تعمل كما هو متوقع. تعمل هذه الاختبارات كفحوصات آلية يمكنها تنبيهك عندما لا يعمل شيء ما بشكل صحيح.
لا تقتصر فائدة الاختبارات على اكتشاف الأخطاء فحسب، بل تساعد أيضًا في منعها. إذا كتبتَ الاختبارات قبل كتابة الدوال، فيمكنها توجيهك في كتابة الشيفرة نفسها. تُسمى هذه الطريقة، التي تعتمد على كتابة الاختبارات قبل الشيفرة التي تُنفّذ الدوال المُختبرة، بالتطوير الموجه بالاختبارات. حتى بدون تطبيق منهجية التطوير الموجه بالاختبارات بشكل كامل، يمكنك استخدام الاختبارات لإعادة إنتاج الأخطاء بشكل منهجي، مما يُسهّل عملية اكتشاف المشاكل وإصلاحها.
تصحيح الأخطاء باستخدام الاختبارات
لمعرفة كيفية تصحيح الأخطاء باستخدام اختبارات الوحدات، أنشئ ملفًا باسم test_fruit.py. في هذا الملف، أضف بعض حالات الاختبار للدالة المسماة ()capitalize_fruit_names. تأخذ هذه الدالة قائمة بأسماء الفواكه وتعيد القائمة مع كتابة أسماء الفواكه بأحرف كبيرة.
لمعالجة الحالات التي تواجه فيها الدالة عنصرًا غير نصي في قائمة الفواكه المدخلة، يجب تخطي المدخلات غير النصية وتحويل الأحرف الأولى من السلاسل النصية فقط إلى أحرف كبيرة. إليك أمثلة على حالات الاختبار:
import unittest
from fruit import capitalize_fruit_names
class TestFruit(unittest.TestCase):
def test_empty_list(self):
"""with empty list"""
self.assertEqual(capitalize_fruit_names([]), [])
def test_lowercase(self):
"""with lowercase strings"""
self.assertEqual(
capitalize_fruit_names(["apple", "banana", "cherry"]),
["Apple", "Banana", "Cherry"],
)
def test_uppercase(self):
"""with uppercase strings"""
self.assertEqual(
capitalize_fruit_names(["APPLE", "BANANA", "CHERRY"]),
["Apple", "Banana", "Cherry"],
)
def test_mixed_case(self):
"""with mixed case strings"""
self.assertEqual(
capitalize_fruit_names(["mAnGo", "grApE"]),
["Mango", "Grape"],
)
def test_non_string_element(self):
"""with a mix of integer and string elements"""
self.assertEqual(
capitalize_fruit_names([123, "banana"]),
["", "Banana"],
)
if __name__ == "__main__":
unittest.main()
هنا، قمت بإنشاء خمس حالات اختبار بناءً على قيم القائمة التي تم تمريرها إلى الدالة ()capitalize_fruit_names. تتحقق كل حالة اختبار مما إذا كانت الدالة تُنتج المخرجات المتوقعة. عند تشغيل الاختبارات، تساعدك أي حالة فاشلة في تحديد ما هو مفقود أو غير صحيح في سلوك الدالة.
على سبيل التجربة، قم بإعادة ملف fruit.py إلى وظيفته الأصلية، بدون أي عمليات تحقق أو تدقيق للقيم غير النصية:
def capitalize_fruit_names(fruits):
capitalized_fruit_names = []
for fruit in fruits:
capitalized_fruit_names.append(fruit.capitalize())
return capitalized_fruit_names
عند تشغيل ملف الاختبار، ستلاحظ أن جميع حالات الاختبار تنجح باستثناء حالة الاختبار test_non_string_element. إليك رسالة الخطأ التي ستظهر لك لحالة الاختبار الفاشلة:
$ python -m unittest test_fruit.py
...E.
======================================================================
ERROR: test_non_string_element (test_fruit.TestFruit.test_non_string_element)
with a mix of integer and string elements
----------------------------------------------------------------------
Traceback (most recent call last):
File "test_fruit.py", line 33, in test_non_string_element
capitalize_fruit_names([123, "banana"]),
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "fruit.py", line 5, in capitalize_fruit_names
capitalized_fruit_names.append(fruit.capitalize())
^^^^^^^^^^^^^^^^
AttributeError: 'int' object has no attribute 'capitalize'
----------------------------------------------------------------------
Ran 5 tests in 0.002s
FAILED (errors=1)
يحدث الخطأ المذكور أعلاه بسبب اختبار ()test_non_string_element. في هذا الاختبار، من المتوقع أن تقوم الدالة باستبدال أي قيم غير نصية في قائمة الفواكه بسلاسل نصية فارغة.
مع ذلك، لم يتم التعامل مع هذه الحالة بعد داخل الدالة ()capitalize_fruit_names. ولأنك تحتاج إلى أن تتعامل الدالة مع هذا الاستبدال، أضف الكود التالي لتحديث الدالة بحيث يتم استبدال القيم غير النصية بسلاسل نصية فارغة:
def capitalize_fruit_names(fruits):
capitalized_fruit_names = []
cleaned = [fruit if isinstance(fruit, str) else "" for fruit in fruits]
for fruit in cleaned:
capitalized_fruit_names.append(fruit.capitalize())
return capitalized_fruit_names
إذا قمت بإعادة تشغيل الاختبارات، فمن المفترض أن تحصل على النتيجة التالية، مع سير جميع الاختبارات بسلاسة:
$ python -m unittest test.py
.....
----------------------------------------------------------------------
Ran 5 tests in 0.000s
OK
بإضافة شرط الاستبدال إلى ملف fruit.py، تم الآن معالجة حالة الاختبار للقيم غير النصية، واجتازت جميع الاختبارات بنجاح. يؤكد هذا أن دالة ()capitalize_fruit_names تعمل كما ينبغي.
أصبحت الآن قادرًا على توقع الأخطاء في التعليمات البرمجية الخاصة بك وإصلاحها بسرعة، وأنت في طريقك لتصبح مطور برامج من الطراز الأول.
كما هو الحال في جميع جوانب البرمجة الأخرى، تُعدّ الممارسة المنتظمة مفتاحًا لتصبح مطور بايثون ماهرًا. نتمنى لك جلسات تصحيح أخطاء سريعة ومفيدة وفعّالة!
جدول أخطاء بايثون الشائعة
جدول احترافي يلخص أشهر الأخطاء التي يواجهها مبرمجو بايثون:
| اسم الخطأ (Error Name) | سببه الشائع (Common Cause) | مثال سريع للحل (Quick Fix) |
| SyntaxError | خطأ في قواعد اللغة (مثل نسيان الأقواس أو النقطتين :). | التأكد من إغلاق كل الأقواس ووضع : بعد if و for. |
| IndentationError | عدم تناسق المسافات البادئة (الفراغات في بداية السطر). | توحيد المسافات (استخدام 4 فراغات أو Tab واحد دائماً). |
| NameError | محاولة استخدام متغير أو دالة غير معرفة مسبقاً. | التأكد من كتابة اسم المتغير بشكل صحيح قبل استدعائه. |
| TypeError | إجراء عملية على نوع بيانات غير مناسب (مثل جمع نص مع رقم). | تحويل الرقم لنص str() أو العكس int() قبل العملية. |
| IndexError | محاولة الوصول لعنصر في قائمة باستخدام رقم خارج نطاقها. | التأكد من أن “الاندكس” لا يتجاوز طول القائمة len(list)-1. |
| KeyError | محاولة الوصول لمفتاح (Key) غير موجود داخل القاموس (Dictionary). | استخدام دالة .get() لتجنب الخطأ أو التأكد من وجود المفتاح. |
| ValueError | إعطاء الدالة قيمة بنوع صحيح ولكن محتوى خاطئ (مثل int("abc")). | التأكد من أن البيانات المدخلة قابلة للتحويل (مثلاً نصوص أرقام فقط). |
| AttributeError | محاولة استدعاء دالة غير موجودة لنوع معين (مثل append للنصوص). | التأكد من العمليات المتاحة لكل نوع بيانات (Data Type). |
| ZeroDivisionError | محاولة قسمة أي رقم على صفر. | إضافة شرط if للتأكد أن المقام لا يساوي صفر قبل القسمة. |
الأسئلة الشائعة
الآن وقد اكتسبت بعض الخبرة في تصحيح الأخطاء في بايثون، يمكنك استخدام الأسئلة والأجوبة أدناه للتحقق من فهمك ومراجعة ما تعلمته.
تتعلق هذه الأسئلة الشائعة بأهم المفاهيم التي تم تناولها في هذا الدرس التعليمي. انقر على زر “إظهار/إخفاء” الموجود بجانب كل سؤال لعرض الإجابة.
تشمل التقنيات الشائعة استخدام تتبع الأخطاء، وإضافة استدعاءات ()print، وتعيين نقاط التوقف، وكتابة الاختبارات للمساعدة في تحديد الأخطاء وإصلاحها في كود بايثون الخاص بك.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.
يمكنك استخدام خاصية تتبع الأخطاء لتحديد مكان حدوث خطأ في التعليمات البرمجية الخاصة بك عن طريق فحص رسالة الخطأ، والتي تشير إلى السطر المحدد ونوع الخطأ.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.
يمكنك استخدام دالة ()breakpoint في بايثون لإيقاف تنفيذ التعليمات البرمجية مؤقتًا والدخول في بيئة تصحيح الأخطاء التفاعلية، مما يسمح لك بفحص المتغيرات والتحكم في تدفق برنامجك.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.
يمكنك استخدام ()print لإخراج قيم المتغيرات والتعبيرات في نقاط مختلفة في التعليمات البرمجية الخاصة بك، مما يساعدك على تتبع حالتها وتحديد مكان حدوث الأخطاء.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.
تساعدك كتابة الاختبارات على اكتشاف الأخطاء مبكراً من خلال التحقق من أن التعليمات البرمجية الخاصة بك تنتج النتائج المتوقعة، مما يضمن الموثوقية ويمنع حدوث الأخطاء في المستقبل.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.