خطأ IndentationError: expected an indented block يعني أن بايثون بدأت كتلة جديدة مثل if أو for أو def، لكنها لم تجد تحتها تعليمة مزاحة إلى الداخل.
مثال خاطئ:
age = 20
if age >= 18:
print("Adult")
والصحيح:
age = 20
if age >= 18:
print("Adult")
بعد السطر الذي يبدأ Block وينتهي غالبًا بعلامة :، يجب أن يكون الكود التابع له مزاحًا إلى الداخل. للمبتدئ استخدم 4 Spaces لكل مستوى، وهو الأسلوب الموصى به في PEP 8.
هذا هو الدرس 30 من سلسلة مشكلة وحل. سنركز هنا فقط على رسالة expected an indented block، وليس على جميع أخطاء المسافات البادئة.
{getToc} $title={محتوى المقال}
ماذا يعني IndentationError: expected an indented block؟
بايثون وجدت سطرًا يبدأ كتلة جديدة، لكنها لم تجد تحت هذا السطر Statement مزاحًا إلى الداخل كما توقعت.
مثل:
if condition:
print("Inside the block")
المسافات البادئة في بايثون ليست تنسيقًا بصريًا فقط؛ هي جزء من Syntax وتحدد الأسطر التي تنتمي إلى كل Block.
شكل Traceback في Python الحديثة
مع كود مثل:
if True:
print("Hello")
قد تعرض Python الحديثة رسالة أكثر تحديدًا مثل:
File "main.py", line 2
print("Hello")
^^^^^
IndentationError: expected an indented block after 'if' statement on line 1
الرسالة تشير إلى السطر 2، لكنها تخبرك أيضًا أن المشكلة بدأت بعد جملة if في السطر 1. لذلك افحص السطر المشار إليه والسطر السابق معًا.
السبب الأول: if بدون كود مزاح إلى الداخل
خاطئ:
age = 20
if age >= 18:
print("Adult")
صحيح:
age = 20
if age >= 18:
print("Adult")
سطر print() هو Body الخاص بـif، لذلك يجب أن يكون داخل الكتلة.
السبب الثاني: for بدون Indentation
خاطئ:
for number in range(3):
print(number)
صحيح:
for number in range(3):
print(number)
السبب الثالث: while بدون Body مزاح
خاطئ:
x = 0
while x < 3:
print(x)
صحيح:
x = 0
while x < 3:
print(x)
x += 1
السبب الرابع: def بدون كود داخل الدالة
خاطئ:
def greet():
print("Hello")
في الإصدارات الحديثة قد تظهر رسالة مثل expected an indented block after function definition.
الصحيح:
def greet():
print("Hello")
السبب الخامس: class بدون Body صحيح
خاطئ:
class User:
def greet(self):
print("Hello")
الصحيح:
class User:
def greet(self):
print("Hello")
هنا يوجد مستويان: Method داخل class، ثم الكود داخل Method.
قد يظهر الخطأ أيضًا بعد try
خاطئ:
try:
print(10 / 2)
except ZeroDivisionError:
pass
صحيح:
try:
print(10 / 2)
except ZeroDivisionError:
pass
هذا مثال على المسافة فقط، وليس شرحًا كاملًا لـException Handling.
المشكلة قد تكون في السطر السابق
إذا أشار Traceback إلى print()، لا تنظر إلى print() وحدها. اسأل:
- ماذا يوجد في السطر السابق؟
- هل هو
ifأوforأوdefأو Block آخر؟ - هل ينتهي بـ
:؟ - هل السطر التالي مزاح إلى الداخل فعلًا؟
في كثير من الحالات السطر المشار إليه هو أول مكان اكتشفت فيه بايثون أن الـBlock المطلوب لم يبدأ بشكل صحيح.
ماذا بعد علامة النقطتين : ؟
عندما تبدأ Block مثل if أو elif أو else أو for أو while أو def أو class أو try أو except أو finally أو with، يجب أن توجد كتلة صحيحة في السياق.
الفكرة ليست أن كل : في بايثون تعني Indentation، بل أن Statements التي تفتح Suite أو Block تحتاج Body تابعًا لها.
إذا لم تكن جاهزًا لكتابة الكود: استخدم pass
هذا الكود غير مكتمل:
def my_function():
إذا أردت ترك الدالة فارغة مؤقتًا، استخدم pass:
def my_function():
pass
pass تعليمة صالحة لا تفعل شيئًا، لكنها تجعل الـBlock موجودًا نحويًا حتى تكمل الكود لاحقًا.
التعليقات وحدها لا تكفي داخل Block فارغ
هذا المثال ما يزال ينتج expected an indented block:
if True:
# TODO: add code
التعليق لا يُعد Statement داخل الكتلة. إذا كنت تريد تركها مؤقتًا:
if True:
# TODO: add code
pass
هل Docstring تكفي داخل Function؟
نعم. Docstring هي String literal موجودة كـStatement داخل Body الدالة، لذلك المثال التالي صالح نحويًا:
def greet():
"""Return a greeting."""
لكن إذا كانت الدالة يجب أن تنفذ شيئًا فعليًا، أضف الكود المطلوب لاحقًا.
هل يجب استخدام 4 Spaces؟
PEP 8 توصي باستخدام 4 Spaces لكل مستوى Indentation. هذا هو الأسلوب الأفضل للمبتدئ ولأغلب مشاريع بايثون.
لكن من الناحية النحوية، ليست الفكرة أن الرقم 4 هو العدد الوحيد الذي يمكن لمفسر بايثون قبوله؛ المهم أن تكون مستويات الإزاحة صحيحة ومتسقة. لذلك القاعدة العملية لك: استخدم 4 Spaces دائمًا.
Tab أم Spaces؟
يفضل استخدام Spaces، واضبط المحرر على Tab Size = 4 وتحويل Tab إلى Spaces. لا تخلط Tabs وSpaces داخل الملف.
لكن تذكر: خلط Tabs وSpaces أو الخروج إلى مستوى غير مطابق قد ينتج أخطاء أخرى مثل TabError أو unindent does not match any outer indentation level، وهي ليست الرسالة المستهدفة في هذا المقال.
Blocks متداخلة: كل مستوى يحتاج إزاحة إضافية
logged_in = True
is_admin = True
if logged_in:
if is_admin:
print("Admin")
الـif الثانية داخل الأولى، وprint() داخل الثانية، لذلك كل Block جديد يزيد مستوى الإزاحة.
موضع else وelif
يجب أن تكون else على مستوى if نفسها، بينما Body الخاص بها يكون مزاحًا للداخل:
score = 75
if score >= 50:
print("Pass")
else:
print("Fail")
لا تنسب كل خطأ في موضع else إلى expected an indented block؛ بعض الأشكال الخاطئة قد تنتج SyntaxError أو رسالة Indentation مختلفة.
مثال عملي كامل
خاطئ:
score = 85
if score >= 90:
print("Excellent")
elif score >= 70:
print("Good")
else:
print("Try again")
الصحيح:
score = 85
if score >= 90:
print("Excellent")
elif score >= 70:
print("Good")
else:
print("Try again")
الناتج:
Good
خطوات تشخيص expected an indented block
- اقرأ السطر المشار إليه في Traceback.
- راجع السطر السابق مباشرة.
- اسأل: هل السطر السابق يبدأ Block وينتهي بـ
:؟ - تأكد أن هناك Statement تحته مزاحًا إلى الداخل.
- للمبتدئ استخدم 4 Spaces.
- راجع الـBlocks المتداخلة؛ كل مستوى جديد يحتاج إزاحة إضافية.
- إذا كانت الكتلة فارغة مؤقتًا، استخدم
pass. - شغّل البرنامج من جديد واقرأ أول رسالة خطأ متبقية.
أخطاء شائعة أثناء محاولة الإصلاح
- إضافة Spaces إلى السطر الخطأ: المطلوب إزاحة Body، لا Statement مثل
ifنفسها. - إزاحة الملف كله: لا تجعل كل الأسطر داخل Block واحد بلا سبب.
- خلط Tab وSpaces: قد يحول المشكلة إلى خطأ Indentation آخر.
- استخدام مستويات مختلفة داخل نفس Block: حافظ على المستوى نفسه للأسطر المتساوية منطقيًا.
- حذف
:بدل إصلاح Body: غالبًا سيؤدي إلى SyntaxError بدل حل المشكلة. - ترك
passللأبد: استخدمها مؤقتًا ثم استبدلها بالكود الحقيقي عندما تكون الدالة أو الكتلة جاهزة.
الفرق بين أخطاء Indentation المتشابهة
| رسالة الخطأ | السبب المعتاد |
|---|---|
expected an indented block | Block بدأ لكن Body المطلوب غير مزاح إلى الداخل أو غير موجود. |
unexpected indent | وجدت بايثون إزاحة في مكان لا تتوقع فيه Block. |
unindent does not match any outer indentation level | الخروج من مستوى الإزاحة لا يطابق مستوى سابقًا. |
TabError | استخدام Tabs وSpaces بطريقة غير متناسقة. |
إذا كانت رسالتك هي unindent does not match any outer indentation level، فهذه مشكلة مختلفة ومغطاة في مشكلة وحل 3: حل خطأ IndentationError unindent does not match any outer indentation level.
الفرق بين هذا المقال ودرس Indentation الأساسي
هذا المقال يعالج رسالة خطأ واحدة محددة: IndentationError: expected an indented block. أما إذا كنت تريد فهم مفهوم المسافات البادئة نفسه، فراجع أساسيات بايثون 3: ما معنى Indentation في بايثون؟.
نصائح سريعة داخل VS Code والمحررات
- اضبط Tab Size على 4.
- استخدم Spaces بدل Tabs.
- فعّل عرض المسافات Whitespace إذا كان موضع الإزاحة غير واضح.
- استخدم Format Document للمساعدة في التنسيق، لكن لا تعتمد عليه كحل سحري.
Formatter قد يرتب كودًا موجودًا، لكنه لا يستطيع معرفة التعليمة التي كنت تريد كتابتها داخل Block فارغ. يجب أن تفهم أين يبدأ Body وأين ينتهي.
جرّب الخطأ بنفسك
يمكنك تجربة المثال القصير في محرر بايثون العرب:
if True:
print("Hello")
ثم أضف 4 Spaces قبل print() وشغّل الكود مرة أخرى لترى الفرق مباشرة.
مصدر رسمي
الخلاصة
خطأ IndentationError: expected an indented block يظهر عندما تبدأ Block مثل if أو for أو def ثم لا تضع تحتها Statement مزاحًا إلى الداخل.
افحص السطر المشار إليه والسطر السابق، وابحث عن Statement يفتح Block وينتهي بـ:. استخدم 4 Spaces للمستوى الواحد، وإذا كانت الكتلة فارغة مؤقتًا فاستخدم pass.
{alertSuccess} القاعدة العملية: إذا بدأت Block جديدًا، يجب أن يحتوي على Body صحيح مزاح إلى الداخل.
أسئلة شائعة
ماذا يعني expected an indented block؟
يعني أن بايثون وجدت بداية Block مثل if أو def، لكنها لم تجد تحتها Statement مزاحًا إلى الداخل كما هو مطلوب.
كيف أصلح IndentationError في بايثون؟
راجع السطر المشار إليه والسطر السابق، ثم أزح Body الخاص بالكتلة إلى الداخل بمستوى متسق. للمبتدئ استخدم 4 Spaces.
كم مسافة أضع بعد if في بايثون؟
PEP 8 توصي بـ4 Spaces لكل مستوى. ليست 4 هي القيمة الوحيدة الممكنة نحويًا، لكنها المعيار العملي الذي يُنصح باستخدامه.
لماذا يظهر الخطأ بعد def؟
لأن تعريف الدالة يحتاج Body مزاحًا إلى الداخل. إذا لم تكن جاهزًا لكتابة الدالة، ضع pass مؤقتًا.
هل أستخدم Tab أم Spaces؟
يفضل استخدام Spaces وضبط المحرر على 4 Spaces. لا تخلط Tabs وSpaces داخل الملف.
ماذا أكتب إذا كانت الدالة فارغة مؤقتًا؟
استخدم pass داخل الدالة حتى تصبح الكتلة صالحة نحويًا.
ما الفرق بين expected an indented block وunexpected indent؟
الأول يعني أن بايثون كانت تتوقع Body مزاحًا إلى الداخل ولم تجده، بينما unexpected indent يعني وجود إزاحة في مكان لم تتوقعها فيه بايثون.

