رفع خطاهای پایتون

خطای unexpected EOF while parsing در پایتون؛ پرانتز یا کوتیشن بسته‌نشده

خطای unexpected EOF while parsing در پایتون؛ پرانتز یا کوتیشن بسته‌نشده

🗓 آخرین به‌روزرسانی:

EOF مخفف End Of File یعنی «پایان فایل» است. خطای unexpected EOF while parsing یعنی پایتون به انتهای کد رسیده در حالی که هنوز منتظر بسته شدن چیزی بوده است؛ معمولاً یک پرانتز، براکت، آکولاد یا کوتیشن. در پایتون ۳.۱۰ به بعد همین مشکل با پیام‌های واضح‌تری مثل '(' was never closed یا unterminated string literal گزارش می‌شود.

معنی خطای SyntaxError در پایتون

پایتون کد را از ابتدا تا انتها می‌خواند و هر پرانتز یا براکت باز را در ذهن نگه می‌دارد تا بسته شود. اگر فایل (یا ورودی) تمام شود و چیزی باز مانده باشد، SyntaxError رخ می‌دهد. نسخه‌های قدیمی‌تر پایتون پیام کلی unexpected EOF while parsing را نشان می‌دادند، اما نسخه‌های جدید دقیقاً می‌گویند کدام علامت و در کدام خط بسته نشده است.

علت‌های رایج این خطا

  • پرانتز بسته‌نشده در print( یا فراخوانی تابع.
  • براکت یا آکولاد بسته‌نشده در تعریف لیست یا دیکشنری چندخطی.
  • کوتیشن بسته‌نشده در رشته.
  • کپی ناقص کد یا اجرای بخشی از کد در محیط تعاملی.

کد غلط و کد درست (با خروجی واقعی)

همه نمونه‌کدهای زیر با پایتون 3.13.5 اجرا شده‌اند و خروجی‌ها همان چیزی است که پایتون واقعاً نمایش می‌دهد.

مثال 1: پرانتز بسته‌نشده

❌ کد غلط:

print("Hello"

خروجی:

  File "/home/user/project/main.py", line 1
    print("Hello"
         ^
SyntaxError: '(' was never closed

✅ کد درست:

print("Hello")

خروجی:

Hello

مثال 2: دیکشنری چندخطی ناقص

❌ کد غلط:

user = {
    "name": "Sara",
    "age": 25,

خروجی:

  File "/home/user/project/main.py", line 1
    user = {
           ^
SyntaxError: '{' was never closed

✅ کد درست:

user = {
    "name": "Sara",
    "age": 25,
}
print(user)

خروجی:

{'name': 'Sara', 'age': 25}

مثال 3: کوتیشن بسته‌نشده

❌ کد غلط:

message = "Hello
print(message)

خروجی:

  File "/home/user/project/main.py", line 1
    message = "Hello
              ^
SyntaxError: unterminated string literal (detected at line 1)

✅ کد درست:

message = "Hello"
print(message)

خروجی:

Hello

راه‌حل قدم‌به‌قدم

  1. به خطی که پیام خطا نشان می‌دهد بروید؛ در نسخه‌های جدید همان خط محل باز شدن علامت است.
  2. پرانتزها، براکت‌ها و آکولادها را جفت‌جفت بشمارید.
  3. کوتیشن‌های ابتدا و انتهای رشته‌ها را بررسی کنید و از یک نوع کوتیشن استفاده کنید.
  4. از ویرایشگری استفاده کنید که پرانتزهای جفت را رنگی نشان می‌دهد (مثل VS Code).
  5. اگر کد را کپی کرده‌اید، مطمئن شوید همه خطوط آن را کپی کرده‌اید.

خواندن پیام unexpected EOF while parsing و عیب‌یابی

EOF مخفف End Of File است. این پیام یعنی پایتون به انتهای فایل یا انتهای ورودی رسیده در حالی که هنوز منتظر بسته شدن چیزی بوده است؛ مثلاً پرانتز، کروشه، آکولاد یا رشته‌ای که باز شده ولی بسته نشده، یا بلوک try که except ندارد. در پایتون 3.10 به بعد همین مشکل اغلب با پیام‌های دقیق‌تری مثل '(' was never closed نمایش داده می‌شود.

نکته مهم این است که شماره خط در این خطا معمولاً آخر فایل را نشان می‌دهد، نه جایی که اشتباه رخ داده است. پس باید از خط گزارش‌شده به عقب برگردید و دنبال آخرین پرانتز یا رشته بازمانده بگردید. کد زیر نشان می‌دهد پایتون 3.13 برای چند حالت رایج چه پیامی می‌دهد.

پیام‌های پایتون 3.13 برای ورودی ناتمام

samples = {
    "open paren": "print('hello'",
    "open bracket": "items = [1, 2, 3",
    "open string": "text = 'hello",
}

for label, code in samples.items():
    try:
        compile(code, "demo.py", "exec")
    except SyntaxError as error:
        print(label, "->", error.msg)

خروجی (اجراشده با Python 3.13):

open paren -> '(' was never closed
open bracket -> '[' was never closed
open string -> unterminated string literal (detected at line 1)

قدم‌به‌قدم رفع unexpected EOF

پایتون انتهای فایل را گزارش می‌کند؛ کار شما پیدا کردن نقطه باز ماندن است.

  1. به شماره خط اعتماد نکنید: خطی که گزارش شده معمولاً آخرین خط فایل است؛ از آنجا به سمت بالا بروید.
  2. جفت‌ها را بشمارید: در آخرین فراخوانی‌ها تعداد ( و )، [ و ] و { و } را بررسی کنید؛ ویرایشگر جفت هر پرانتز را رنگی نشان می‌دهد.
  3. رشته‌ها را بررسی کنید: کوتیشن بسته‌نشده یا سه‌کوتیشن ناتمام، باقی فایل را رشته حساب می‌کند.
  4. بلوک‌های ناقص را پیدا کنید: try بدون except یا finally و def بدون بدنه هم پایتون را منتظر نگه می‌دارند.
  5. نصف کردن فایل: اگر پیدا نشد، نیمه پایینی کد را موقتاً کامنت کنید و با python -m py_compile محدوده را کوچک کنید.

چک‌لیست پیشگیری

  • از ویرایشگری استفاده کنید که پرانتز و کوتیشن را خودکار می‌بندد و جفت‌ها را رنگی نشان می‌دهد.
  • فراخوانی‌های طولانی را در چند خط بنویسید تا پرانتز پایانی واضح دیده شود.
  • در مفسر تعاملی، بعد از نوشتن بلوک یک خط خالی بزنید تا ورودی کامل شود.
  • وقتی رشته JSON یا ورودی را با eval پردازش می‌کنید، از json.loads یا ast.literal_eval استفاده کنید.
  • بعد از هر تغییر بزرگ، فایل را با python -m py_compile بررسی کنید.

📌 همچنین بخوانید: خطای ‘int’ object is not subscriptable در پایتون، خطای ImportError و خطای RecursionError در پایتون

سؤالات متداول

چرا در نسخه‌های جدید پایتون پیام unexpected EOF را نمی‌بینم؟

از پایتون ۳.۱۰ تجزیه‌گر جدید پیام دقیق‌تری می‌دهد؛ مثلاً '(' was never closed. ماهیت خطا همان است.

در input() هم EOF Error داریم؟

بله، اما آن خطای متفاوتی به نام EOFError است و وقتی رخ می‌دهد که input() منتظر ورودی باشد ولی ورودی تمام شده باشد (مثلاً در برخی محیط‌های آنلاین).

رشته چندخطی را چطور بنویسم؟

از سه کوتیشن """متن""" استفاده کنید یا رشته‌ها را داخل پرانتز چند خط کنید.

چرا شماره خط خطا آخر فایل است؟

چون پایتون تا انتهای فایل منتظر بسته شدن پرانتز یا بلوک می‌ماند و فقط آنجا متوجه کمبود می‌شود. اشتباه واقعی معمولاً چند خط بالاتر است.

این خطا با input هم رخ می‌دهد؟

EOFError متفاوت است و وقتی رخ می‌دهد که input منتظر ورودی باشد ولی جریان ورودی تمام شده باشد؛ مثلاً در اجرای آنلاین بدون stdin.

چرا در پایتون جدید پیام unexpected EOF را نمی‌بینم؟

از نسخه 3.10 پیام‌ها دقیق‌تر شده‌اند و به جای آن عبارت‌هایی مثل was never closed یا unterminated string literal نشان داده می‌شود.

آموزش‌های مرتبط

آموزش‌های تازه، کد آماده و رفع خطاهر هفته در کانال Dev Source؛ رایگان.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *