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

خطای SyntaxError: invalid syntax در پایتون؛ علت‌ها و رفع سریع

خطای SyntaxError: invalid syntax در پایتون؛ علت‌ها و رفع سریع

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

خطای SyntaxError: invalid syntax یکی از کلی‌ترین و پرتکرارترین خطاهای پایتون است. وقتی آن را می‌بینید یعنی پایتون نتوانسته جمله‌ای را که نوشته‌اید «بخواند»؛ درست مثل جمله‌ای که دستور زبانش غلط باشد. خبر خوب این است که پایتون معمولاً با علامت ^ دقیقاً جای مشکل را نشان می‌دهد و نسخه‌های جدید پایتون (۳.۱۰ به بعد) پیشنهادهای دقیق‌تری هم ارائه می‌کنند.

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

SyntaxError یعنی ساختار نوشتاری کد شما با قواعد زبان پایتون مطابقت ندارد. این خطا مثل IndentationError پیش از اجرای برنامه رخ می‌دهد؛ پس تا آن را رفع نکنید هیچ خطی اجرا نمی‌شود. عبارت invalid syntax عمومی‌ترین شکل این خطاست و پایتون در نسخه‌های جدید اغلب توضیح بیشتری مانند expected ':' یا Maybe you meant '==' هم اضافه می‌کند.

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

  • جا انداختن دونقطه : در انتهای if، for، while، def و class.
  • استفاده از = (انتساب) به جای == (مقایسه) داخل شرط.
  • باز گذاشتن کوتیشن یا پرانتز.
  • استفاده از کلمات کلیدی رزرو‌شده مثل class یا for به عنوان نام متغیر.
  • اجرای کد پایتون ۲ (مثل print "hello") در پایتون ۳.

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

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

مثال 1: فراموش کردن دونقطه

❌ کد غلط:

score = 15
if score > 10
    print("Great")

خروجی:

  File "/home/user/project/main.py", line 2
    if score > 10
                 ^
SyntaxError: expected ':'

✅ کد درست:

score = 15
if score > 10:
    print("Great")

خروجی:

Great

مثال 2: استفاده از = به جای ==

❌ کد غلط:

x = 5
if x = 5:
    print("Equal")

خروجی:

  File "/home/user/project/main.py", line 2
    if x = 5:
       ^^^^^
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?

✅ کد درست:

x = 5
if x == 5:
    print("Equal")

خروجی:

Equal

مثال 3: دستور print به سبک پایتون ۲

❌ کد غلط:

print "Hello"

خروجی:

  File "/home/user/project/main.py", line 1
    print "Hello"
    ^^^^^^^^^^^^^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?

✅ کد درست:

print("Hello")

خروجی:

Hello

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

  1. به خط و علامت ^ در پیام خطا دقت کنید؛ مشکل در همان نقطه یا کمی قبل از آن است.
  2. انتهای خط شرط، حلقه یا تابع را برای دونقطه : بررسی کنید.
  3. داخل شرط‌ها مطمئن شوید از == برای مقایسه استفاده کرده‌اید.
  4. کوتیشن‌ها و پرانتزها را جفت‌جفت بشمارید.
  5. اگر کد را از منبع قدیمی کپی کرده‌اید، دستورات پایتون ۲ را به نسخه ۳ تبدیل کنید.

خواندن پیام SyntaxError و عیب‌یابی

SyntaxError پیش از اجرای کد رخ می‌دهد؛ یعنی پایتون حتی یک خط از برنامه را اجرا نمی‌کند چون متن فایل را نمی‌تواند به‌عنوان کد معتبر بخواند. پیام خطا شماره خط و یک علامت ^ زیر محل تقریبی اشکال نشان می‌دهد. در پایتون 3.10 به بعد پیام‌ها بسیار دقیق‌تر شده‌اند و اغلب علت را مستقیماً می‌گویند.

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

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

samples = {
    "missing colon": "if True\n    pass",
    "assign in if": "if x = 5:\n    pass",
    "print 2 style": "print 'hi'",
}

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

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

missing colon -> expected ':'
assign in if -> invalid syntax. Maybe you meant '==' or ':=' instead of '='?
print 2 style -> Missing parentheses in call to 'print'. Did you mean print(...)?

قدم‌به‌قدم رفع SyntaxError

کد اصلاً اجرا نشده؛ پس فقط متن کد را باید بررسی کنید.

  1. علامت ^ را ببینید: پایتون زیر محل تقریبی اشکال علامت می‌گذارد؛ آن نقطه و قبل از آن را بررسی کنید.
  2. پیام دقیق را بخوانید: expected ‘:’، Maybe you meant ‘==’، Missing parentheses و invalid character هرکدام علت را مستقیم می‌گویند.
  3. خط قبلی را چک کنید: پرانتز یا کوتیشن بازمانده در خط قبل، خط بعدی را نامعتبر نشان می‌دهد.
  4. کاراکترهای کپی‌شده را بررسی کنید: کوتیشن‌های خمیده، ویرگول فارسی و فاصله نامرئی را با تایپ مجدد جایگزین کنید.
  5. نسخه پایتون را بسنجید: نحوهایی مثل match یا := در نسخه‌های قدیمی SyntaxError می‌دهند؛ python –version را بررسی کنید.

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

  • از ویرایشگری استفاده کنید که خطای نحوی را هنگام تایپ زیر خط قرمز نشان می‌دهد.
  • بعد از if، for، while، def و class دونقطه را فراموش نکنید.
  • برای مقایسه از == و برای مقداردهی از = استفاده کنید.
  • کدهای قدیمی پایتون 2 را با نحو پایتون 3 بازنویسی کنید؛ print تابع است.
  • کلمات کلیدی مثل class، def یا lambda را نام متغیر قرار ندهید.

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

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

چرا پایتون خط اشتباه را نشان می‌دهد ولی مشکل در خط قبلی است؟

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

آیا SyntaxError با try/except گرفته می‌شود؟

خیر؛ چون این خطا قبل از اجرای برنامه و هنگام تجزیه کد رخ می‌دهد، try/except همان فایل نمی‌تواند آن را بگیرد. باید خود کد را اصلاح کنید.

نسخه پایتونم را از کجا بفهمم؟

در ترمینال دستور python --version را اجرا کنید. پیام‌های خطای دقیق‌تر در پایتون ۳.۱۰ به بعد در دسترس است.

چرا SyntaxError در خطی گزارش می‌شود که درست است؟

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

invalid character یعنی چه؟

یعنی کاراکتری مثل کوتیشن فارسی، ویرگول فارسی یا فاصله نامرئی از متن کپی‌شده وارد کد شده است؛ آن را با کاراکتر انگلیسی جایگزین کنید.

آیا try/except می‌تواند SyntaxError را بگیرد؟

نه در همان فایل، چون فایل اصلاً اجرا نمی‌شود؛ فقط در کدی که با compile، eval یا import جداگانه بارگذاری می‌شود.

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

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

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

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