آنچه در این مقاله میخوانید [پنهانسازی]
اگر هنگام اجرای کد پایتون با خطای طولانی و گیجکنندهی IndentationError: unindent does not match any outer indentation level روبهرو شدهای، نگران نباش! این خطا یکی از رایجترین خطاهای پایتون مخصوصاً برای تازهکارهاست. در واقع، پایتون نسبت به تورفتگی یا فاصله در ابتدای خطوط کد حساس است و کوچکترین ناهماهنگی در آن میتواند برنامه را متوقف کند. در این مقاله به زبان ساده توضیح میدهیم که چرا خطای IndentationError رخ میدهد و چطور میتوان خیلی سریع آن را برطرف کرد.
سرفصل های مقاله
- مفهوم کلی خطای IndentationError
- چرا این خطا اتفاق میافتد؟
- ۱. ترکیب فاصله (Space) و تب (Tab) در یک فایل
- ۲. تورفتگی نامنظم در بین بلوکهای کد
- ۳. کپی کردن کد از منابع مختلف
- ۴. استفاده اشتباه از چند سطح تورفتگی
- چطور بفهمیم مشکل دقیقاً کجاست؟
- روشهای جلوگیری از بروز دوباره خطا
- از ویرایشگر حرفهای استفاده کن
- تورفتگی ثابت در تنظیمات
- قالببندی خودکار با Black یا Autopep8
- جمع بندی
مفهوم کلی خطای IndentationError
پایتون برخلاف زبانهایی مثل جاوا یا جاوااسکریپت از علامت {} برای تعریف محدودهها استفاده نمیکند. در عوض، از تورفتگی (Indentation) استفاده میکند تا بفهمد هر بخش از کد متعلق به کدام ساختار است. وقتی تورفتگی بین خطوط کد یک بلوک هماهنگ نباشد، پایتون نمیتواند تشخیص دهد که آن خط به کدام سطح از بلوک تعلق دارد و در نتیجه خطای زیر را نمایش میدهد:
IndentationError: unindent does not match any outer indentation level
به زبان ساده یعنی: «تورفتگی این خط با سطح تورفتگی خطوط قبلی همخوانی ندارد.»
چرا این خطا اتفاق میافتد؟
۱. ترکیب فاصله (Space) و تب (Tab) در یک فایل
رایجترین دلیل بروز این خطا ترکیب دو نوع تورفتگی است. پایتون به ظاهر فاصله و تب را یکی نمیداند.
ممکن است بخشی از کد را با دکمه Tab و بخش دیگر را با فاصله نوشته باشی.
مثلاً:
def greet():
print("Hello")
print("World")
در نگاه اول درست به نظر میرسد، اما خط دوم با تب تورفتگی دارد و خط اول با ۴ فاصله. همین اختلاف باعث خطای unindent میشود.
راه حل:
در محیطهایی مثل VS Code میتوانی از منوی پایین صفحه نوع تورفتگی را به “Spaces: 4” تغییر دهی و همه تبها را به فاصله تبدیل کنی.
۲. تورفتگی نامنظم در بین بلوکهای کد
اگر در داخل ساختارهایی مثل if، for، while یا def یک یا چند خط تورفتگی کمتر یا بیشتر داشته باشند، پایتون خطا میدهد.
for i in range(3):
print(i)
print("Done")
در این مثال، خط دوم نسبت به خط اول تورفتگی کمتری دارد. در نتیجه، مفسر پایتون نمیداند کدام خط باید داخل حلقه باشد.
راه حل:
تمام خطوط داخل یک بلوک باید دقیقاً یک میزان تورفتگی برابر داشته باشند. بهترین روش این است که از ۴ فاصله ثابت در هر سطح استفاده کنی.
۳. کپی کردن کد از منابع مختلف
اگر از وبسایتها یا فایلهای دیگر کد کپی میکنی، احتمال دارد فاصلههای نامرئی یا کاراکترهای تب متفاوت در متن وجود داشته باشد. حتی اگر ظاهر کد مرتب به نظر برسد، در پشت صحنه تفاوتهایی وجود دارد که پایتون متوجه میشود.
راه حل:
کد را در محیطی مثل VS Code انتخاب کن، سپس از دستور
Convert Indentation to Spaces
استفاده کن تا همه خطوط یکدست شوند.
۴. استفاده اشتباه از چند سطح تورفتگی
گاهی اوقات کاربر بهاشتباه سطحهای اضافی از تورفتگی اضافه میکند، مخصوصاً وقتی کد چندبخشی دارد.
def show_numbers():
for i in range(3):
print(i)
در این مثال، تابع show_numbers بیش از حد تو رفته است. این هم باعث خطای unindent میشود چون سطح تورفتگی تعریف تابع با استاندارد بقیه کد همخوانی ندارد.
راه حل:
هر سطح باید دقیقاً با ساختار بالادستیاش مطابقت داشته باشد. برای مثال، توابع و کلاسها نباید خودسرانه بیش از حد تو رفته باشند.
چطور بفهمیم مشکل دقیقاً کجاست؟
پایتون در پیام خطا، شمارهی خطی که مشکل دارد را نمایش میدهد.
برای مثال:
File "main.py", line 8
print("Done")
^
IndentationError: unindent does not match any outer indentation level
این یعنی در خط ۸ تورفتگی ناسازگار با سایر خطوط بلوک وجود دارد. برای رفع سریع:
- همه خطوط اطراف را با دقت بررسی کن.
- مطمئن شو تمام تورفتگیها از یک نوع هستند (فقط فاصله یا فقط تب).
- از ابزار “Format Document” در VS Code یا PyCharm استفاده کن تا کد خودکار اصلاح شود.
روشهای جلوگیری از بروز دوباره خطا
از ویرایشگر حرفهای استفاده کن
با ویرایشگرهای هوشمند مثل VS Code، PyCharm یا Jupyter Notebook کد بزن.
این ابزارها با رنگ یا هشدار بصری، تورفتگیهای اشتباه را بهسرعت نشان میدهند.
تورفتگی ثابت در تنظیمات
در تنظیمات محیط توسعه حتماً مقدار زیر را فعال کن:
Tab Size: 4
Insert Spaces: True
این باعث میشود دکمه Tab همیشه به چهار فاصله تبدیل شود و ناسازگاری ایجاد نشود.
قالببندی خودکار با Black یا Autopep8
ابزارهای قالببندی خودکار مثل Black یا Autopep8 طبق استاندارد PEP8 کد را مرتب میکنند.
با این ابزارها، حتی اگر اشتباهی هم در تورفتگی کرده باشی، بهصورت خودکار اصلاح میشود.
جمع بندی
خطای IndentationError: unindent does not match any outer indentation level در پایتون نشانهی ناهماهنگی بین تورفتگی خطوط کد است.
این خطا اغلب بهخاطر ترکیب فاصله و تب، کپی از منابع مختلف یا ناهماهنگی در سطوح تورفتگی ایجاد میشود.
اگر همیشه از ۴ فاصلهی ثابت برای هر سطح تورفتگی استفاده کنی و از ابزارهای قالببندی خودکار بهره ببری، نهتنها این خطا بلکه بسیاری از خطاهای مشابه را هم نخواهی دید.
یادت باشد در پایتون، نظم در تورفتگی همان نظم در تفکر برنامهنویسی است.






