مشكلة وحل #3: المسافات وعلامات التبويب (IndentationError)

مشكلة وحل #3: المسافات وعلامات التبويب (IndentationError)

 👩‍💻 شكوى الأخت "سارة":

"مرحبًا فريق بايثون العرب، أنا سارة، بدأت مؤخرًا بتعلم بايثون. كتبت برنامجًا صغيرًا فيه جمل شرطية وحلقات تكرار، لكن كلما أحاول تشغيله يعطيني خطأ غريب جدًا: IndentationError: unindent does not match any outer indentation level. الكود شكله صحيح قدام عيني! لما أشوف الأكواد في الدروس تكون المسافات متساوية، وأنتم تقولون بايثون تعتمد على المسافات، وأنا ضاغطة المسافة (Space) كذا مرة. لكن الخطأ يظهر ويختفي، مرة يشتغل ومرة يرفض! غريب! هل المشكلة في لوحة المفاتيح؟ 😅"

✅ الرد والحل العملي (المختصر)

أهلاً بك سارة،

مشكلتك ليست في لوحة المفاتيح ولا في الكود نفسه، بل في خلط نوعين مختلفين من المسافات البيضاء: مفتاح المسافة (Space) و مفتاح التبويب (Tab). هذا خطأ شائع جدًا، خاصة عند النسخ واللصق من مصادر مختلفة أو عند استخدام محررات نصوص غير مضبوطة جيدًا.

الحل العملي الفوري:

  1. إعداد المحرر: افتحي إعدادات محرر النصوص الخاص بك (VS Code, PyCharm, Sublime...) وابحثي عن خيار "Convert Indentation to Spaces" أو "استبدال علامات التبويب بمسافات". فعلّيه.

  2. تنظيف الكود الحالي: داخل المحرر، حددي الكود كله (Ctrl + A)، ثم من قائمة Edit أو ما شابهها اختاري "Convert Indentation to Spaces". إذا لم تجدي هذا الخيار، يمكنك فنّيًا مسح كل المسافات البيضاء في بداية الأسطر وإعادة كتابتها يدويًا باستخدام مسافة (Space) فقط، وتأكدي من أن كل مستوى إزاحة يستخدم نفس العدد من الفراغات (يُفضّل 4 مسافات).

  3. اجعل علامات التبويب مرئية: في معظم المحررات، يمكنك تفعيل إظهار الرموز غير المرئية (View → Render Whitespace). ستظهر المسافات كنقاط . وعلامات التبويب كأسهم →. هذا سيكشف لك فورًا عن الخطأ.

الخلاصة: تأكّدي أن ملف الكود الخاص بك يستخدم إما المسافات (Space) فقط، وإما علامات التبويب (Tab) فقط، ولا تخلطيهما أبدًا.

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

📚 الشرح الكامل للمشكلة وتفاصيلها (لمن تريد فهم الأسباب)

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

1. ما هو Indentation ولماذا هو مهم في بايثون؟
على عكس لغات أخرى تستخدم الأقواس {} لتحديد كتل الأكواد (مثل جملة if أو for)، بايثون تستخدم الإزاحة (Indentation)، أي المسافات البيضاء في بداية السطر. هذا يعطي كود بايثون شكله الأنيق والواضح، ويُجبر المبرمج على كتابة كود مُنسق. أي سطر يبدأ بمسافة أكبر من السطر الذي قبله يُعتبر داخل الكتلة السابقة.

2. اثنان لا يجتمعان: قصة المسافة (Space) وعلامة التبويب (Tab)
هنا تكمن المشكلة. بالنسبة لكِ كبشر، ضغطة Tab قد تبدو مثل 4 مسافات. لكن بالنسبة لحاسوب بايثون، هما شيئان مختلفان تمامًا:

علامة التبويب (Tab): هي حرف واحد (ASCII code 9).

المسافة (Space): هي حرف واحد آخر (ASCII code 32).

عندما يقرأ مفسّر بايثون (Python Interpreter) الكود، فهو لا يرى "شكل" الإزاحة، بل يعدّ عدد الأحرف. إذا كان السطر الأول في كتلة ما مُزاحًا بـ 4 مسافات، والسطر الذي يليه مُزاحًا بضغطة Tab واحدة، فهو يرى عدم تطابق في مستوى الإزاحة، فيطلق الخطأ الشهير IndentationError.

3. مثال عملي من كابوس حقيقي

انظري لهذا الكود المخادع، الذي يبدو صحيحًا بصريًا لكنه يحمل السمّ:
def احسب_المجموع(أرقام):
مجموع = 0
for رقم in أرقام:
مجموع = مجموع + رقم # هذا السطر مُزاح بأربع مسافات (....)
return مجموع # هذا السطر مُزاح بضغطة Tab واحدة (→)

لن يعمل! ستحصلين على الخطأ IndentationError: unindent does not match any outer indentation level لأن السطر الأخير يستخدم Tab، بينما for يستخدم مسافات. بالنسبة لمفسّر بايثون، الإزاحة لا تتطابق مع أي مستوى خارجي.

4. لماذا يظهر الخطأ ويختفي أحيانًا؟
هذا يحدث بكثرة عند نسخ الأكواد من مواقع الإنترنت أو من ملفات PDF. بعض المصادر تستخدم مسافات، والبعض الآخر علامات تبويب. عندما تقومين بلصقها في محررك، يختلط الاثنان. إن كنت محظوظة وساد أحد النوعين، يعمل البرنامج. بمجرد تعديل بسيط وإضافة سطر جديد باستخدام زر Tab بينما الباقي Spaces، تظهر الكارثة.

✨ نصائح من "بايثون العرب" لتجنب هذا الكابوس نهائيًا

  1. قاعدة ذهبية من PEP 8 (دليل أسلوب بايثون الرسمي): استخدمي 4 مسافات لكل مستوى إزاحة. وتجنبي علامات التبويب. هذه هي التوصية الرسمية لمطوري بايثون المحترفين حول العالم.

  2. اضبطي محررك من البداية: في إعدادات المحرر، ابحثي عن:
    • Tab Size: 4.
    • Insert spaces when pressing Tab: فعّلي هذا الخيار. هذا يعني أنه حتى لو ضغطتِ على زر Tab في لوحة المفاتيح، سيقوم المحرر تلقائيًا بإدخال 4 مسافات بدلاً منه.

  3. اجعلي الخبايا ظاهرة: فعّلي خيار إظهار الرموز غير المرئية (Show Whitespace/Invisibles) في محررك. سترين كل نقطة (مسافة) وكل سهم (Tab) أمام عينيك، ولن ينخدع بصرك مرة أخرى.

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

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

إرسال تعليق

أحدث أقدم