من أكثر الأخطاء التي تربك المبتدئين في بايثون خطأ:
IndentationError: unindent does not match any outer indentation level
خصوصًا عندما يبدو الكود مرتبًا أمامك، لكن بايثون يرفض تشغيله.
في هذا الدرس من سلسلة مشكلة وحل على بايثون العرب سنشرح معنى هذا الخطأ، ولماذا يظهر عند خلط المسافات Space مع زر التبويب Tab، وكيف تصلحه بطريقة عملية داخل محرر الأكواد.
{getToc} $title={محتوى المقال}
{alertInfo} هذا الخطأ يعني أن مستويات المسافات البادئة في الكود غير متطابقة. غالبًا السبب هو خلط Space و Tab داخل نفس الملف.
نص المشكلة
تخيل أن مبتدئًا كتب كودًا يحتوي على دالة أو شرط أو حلقة تكرار، ثم عند التشغيل ظهرت له الرسالة التالية:
IndentationError: unindent does not match any outer indentation level
المشكلة هنا ليست دائمًا في المنطق البرمجي نفسه، بل في شكل المسافات الموجودة في بداية الأسطر. في بايثون، المسافات البادئة ليست مجرد تنسيق، بل هي جزء أساسي من بناء الكود.
الحل المختصر
الحل السريع هو توحيد نوع المسافات في الملف كاملًا. استخدم 4 مسافات Spaces لكل مستوى إزاحة، ولا تخلط بينها وبين Tab.
اتبع هذه الخطوات:
- افتح الملف داخل محرر مثل VS Code أو PyCharm أو Notepad++.
- حدد الكود كاملًا باستخدام
Ctrl + A. - استخدم خيار تحويل Tab إلى Spaces إن كان موجودًا.
- اجعل كل مستوى إزاحة يساوي 4 مسافات.
- احفظ الملف ثم شغل الكود مرة أخرى.
{alertSuccess} الخلاصة السريعة: لا تخلط Space و Tab. اجعل ملفك يستخدم Spaces فقط، ويفضل 4 مسافات لكل مستوى إزاحة.
ما معنى Indentation في بايثون؟
كلمة Indentation تعني المسافات البادئة الموجودة في بداية السطر. في لغات برمجة كثيرة تُستخدم الأقواس مثل {} لتحديد بداية ونهاية الكتل البرمجية، لكن بايثون تعتمد على المسافات.
مثال صحيح:
if 10 > 5:
print("10 أكبر من 5")
السطر الذي يحتوي على print() مزاح إلى الداخل، وهذا يخبر بايثون أن هذا السطر تابع لجملة if.
لماذا تظهر مشكلة unindent does not match؟
تظهر المشكلة عندما يجد مفسر بايثون أن أحد الأسطر خرج من مستوى الإزاحة بطريقة لا تتطابق مع أي مستوى سابق. وهذا يحدث غالبًا بسبب:
- استخدام Tab في بعض الأسطر و Spaces في أسطر أخرى.
- نسخ كود من الإنترنت ولصقه داخل ملفك.
- تعديل سطر يدويًا بمسافات مختلفة عن باقي الكود.
- استخدام محرر غير مضبوط لاستبدال Tab بمسافات.
- وجود مسافات زائدة أو ناقصة قبل سطر مثل
returnأوelse.
الفرق بين Space و Tab في بايثون
بالنسبة لك كمستخدم، قد يبدو زر Tab وكأنه يضيف 4 مسافات. لكن بالنسبة لبايثون، Tab و Space شيئان مختلفان.
| العنصر | المعنى | المشكلة المحتملة |
|---|---|---|
Space |
مسافة عادية واحدة | آمنة إذا استخدمتها بشكل موحد. |
Tab |
حرف تبويب واحد | قد يبدو مثل عدة مسافات، لكنه مختلف داخليًا. |
| خلط الاثنين | بعض الأسطر Space وبعضها Tab | يسبب IndentationError غالبًا. |
{alertWarning} المشكلة أن Tab قد يظهر أمام عينك مثل 4 مسافات، لكنه ليس 4 مسافات فعليًا بالنسبة لمفسر بايثون.
مثال يسبب خطأ IndentationError
انظر إلى المثال التالي. قد يبدو شكله قريبًا من الصحيح، لكنه يحتوي على مشكلة في المسافات البادئة:
def calculate_total(numbers):
total = 0
for number in numbers:
total = total + number
return total
السطر الأخير return total لا يطابق مستوى الإزاحة الصحيح. لذلك قد يظهر الخطأ.
التصحيح الصحيح للكود
يجب أن يكون سطر return داخل الدالة، لكنه خارج حلقة for إذا كنا نريد إرجاع المجموع بعد انتهاء الحلقة:
def calculate_total(numbers):
total = 0
for number in numbers:
total = total + number
return total
print(calculate_total([1, 2, 3]))
الناتج:
6
مثال يوضح خلط Tab و Space
أحيانًا يكون الكود ظاهريًا مرتبًا، لكن داخله يوجد خلط بين Tab و Space. مثلًا:
if 5 > 2:
print("السطر الأول داخل الشرط")
print("السطر الثاني يستخدم Tab")
السطر الثاني داخل الشرط قد يبدو قريبًا من السطر الأول، لكنه يستخدم Tab بدل المسافات. لذلك قد يظهر خطأ في الإزاحة.
التصحيح:
if 5 > 2:
print("السطر الأول داخل الشرط")
print("السطر الثاني يستخدم نفس المسافات")
كيف أصلح الخطأ داخل VS Code؟
إذا كنت تستخدم VS Code، يمكنك حل المشكلة بسهولة:
- افتح ملف Python.
- انظر إلى أسفل يمين الشاشة، ستجد شيئًا مثل
Spaces: 4أوTab Size: 4. - اضغط عليه.
- اختر Convert Indentation to Spaces.
- تأكد أن الإعداد أصبح Spaces: 4.
- احفظ الملف وشغله من جديد.
كيف أصلح الخطأ داخل Notepad++؟
إذا كنت تستخدم Notepad++، يمكنك تفعيل إظهار المسافات وتحويل Tab إلى Spaces:
- من القائمة اختر View.
- ثم Show Symbol.
- ثم فعّل Show White Space and TAB.
- إذا وجدت أسهمًا بدل النقاط، فهذا يعني وجود Tab.
- استبدل Tab بمسافات أو أعد كتابة الإزاحة يدويًا.
ويمكنك من الإعدادات ضبط Notepad++ ليستخدم المسافات بدل Tab عند كتابة الأكواد.
أفضل إعدادات لتجنب المشكلة
حتى لا تتكرر المشكلة، اضبط محرر الأكواد من البداية على هذه الإعدادات:
- Tab Size: اجعله 4.
- Insert Spaces: فعّل هذا الخيار.
- Convert Tabs to Spaces: استخدمه عند فتح ملفات من الإنترنت.
- Render Whitespace: فعّل إظهار المسافات عند الحاجة.
{alertSuccess} أفضل عادة للمبتدئ: اضغط Tab عادي، لكن اجعل المحرر يحوّل Tab تلقائيًا إلى 4 مسافات.
أخطاء شائعة تسبب IndentationError
| الخطأ | السبب | الحل |
|---|---|---|
| خلط Tab و Space | بعض الأسطر تستخدم Tab وبعضها Spaces | حوّل الإزاحة كلها إلى Spaces. |
| سطر return في مستوى خاطئ | السطر خارج أو داخل كتلة بشكل غير صحيح | ضع return في المستوى المنطقي المناسب. |
| نسخ كود من موقع آخر | الكود المنسوخ يحمل مسافات مختلفة | نظّف الإزاحة بعد اللصق. |
| كتابة else بمستوى غير مطابق | لا تطابق مستوى if | اجعل else على نفس مستوى if. |
الفرق بين IndentationError و TabError
قد يظهر لك أحيانًا خطأ قريب اسمه TabError. الفرق بينهما بسيط:
| الخطأ | معناه |
|---|---|
IndentationError |
مشكلة عامة في مستويات المسافات البادئة. |
TabError |
مشكلة أوضح بسبب خلط Tab و Spaces بطريقة غير متناسقة. |
في الحالتين، الحل غالبًا هو توحيد الإزاحة واستخدام 4 مسافات لكل مستوى.
طريقة اختبار سريعة لمعرفة مكان الخطأ
إذا لم تعرف أين الخطأ، جرّب هذه الخطوات:
- ابدأ من السطر الذي يظهر في رسالة الخطأ.
- راجع السطر الذي قبله والسطر الذي بعده.
- تأكد أن الأسطر التابعة لنفس الكتلة لها نفس عدد المسافات.
- فعّل إظهار المسافات المخفية في المحرر.
- أعد كتابة بداية الأسطر يدويًا باستخدام 4 مسافات.
غالبًا ستكتشف أن سطرًا واحدًا فقط يستخدم إزاحة مختلفة عن باقي الكتلة.
نصائح لتجنب الخطأ مستقبلًا
- استخدم محرر أكواد جيد مثل VS Code أو PyCharm.
- اضبط المحرر على استخدام 4 مسافات بدل Tab.
- لا تنسخ الأكواد من الإنترنت بدون مراجعة المسافات.
- فعّل إظهار المسافات المخفية عند وجود خطأ غريب.
- اكتب الكود بهدوء، وانتبه لكل كتلة تبدأ بعد
:.
روابط مفيدة من بايثون العرب
- أساسيات بايثون 3: شرح المسافات البادئة Indentation
- مشكلة وحل 10: حل خطأ SyntaxError invalid syntax في بايثون
- مشكلة وحل 9: حل خطأ NameError name is not defined
- محرر بايثون العرب لتجربة الأكواد أون لاين
- جميع مقالات سلسلة مشكلة وحل في بايثون
الخلاصة
خطأ IndentationError: unindent does not match any outer indentation level يحدث عندما لا تتطابق المسافات البادئة في الكود. السبب الأشهر هو خلط Space و Tab، أو وضع سطر مثل return أو else في مستوى إزاحة غير صحيح.
الحل الأفضل هو استخدام 4 مسافات لكل مستوى إزاحة، وضبط محرر الأكواد على تحويل Tab إلى Spaces تلقائيًا. وإذا ظهر الخطأ، فعّل إظهار الرموز المخفية وراجع السطر المذكور في رسالة الخطأ والأسطر القريبة منه.
{alertSuccess} القاعدة الذهبية: في بايثون، الإزاحة جزء من الكود. استخدم 4 مسافات، ولا تخلط Tab و Space.