رفع خطای Invalid Syntax در پایتون؛ بررسی دلایل و راه‌حل‌ها

نمایش پیام SyntaxError invalid syntax در ترمینال محیط کدنویسی پایتون
آنچه در این مطلب می‌خوانید

پایتون به داشتن سینتکس ساده شناخته می‌شود، اما پیام SyntaxError: invalid syntax و توقف کامل برنامه از مشکلات رایج هنگام کدنویسی است. این خطا زمانی رخ می‌دهد که بخشی از کد با قوانین ساختاری پایتون همخوانی نداشته باشد و مفسر نتواند آن را درک کند.

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

در این راهنما یاد می‌گیرید که خطای سینتکس در چه مرحله‌ای رخ می‌دهد، چطور با خواندن دقیق Traceback محل واقعی خطا را پیدا کنید و چگونه رایج‌ترین دلایل بروز خطای Invalid syntax در پایتون را برطرف کنید.

خطای Invalid Syntax در پایتون چیست و چه زمانی رخ می‌دهد؟

وقتی کد پایتون را اجرا می‌کنید، مفسر ابتدا آن را تجزیه (Parse) و سپس اجرا می‌کند. مفسر هرگونه نحو نامعتبر را در همین مرحلهٔ اول، یعنی «مرحله تجزیه» (Parsing)، شناسایی می‌کند. به همین دلیل، خطاهای نحوی را خطای تجزیه (Parsing Error) نیز می‌نامند.

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

تفاوت SyntaxError با Exception؛ چرا try و except کار نمی‌کند؟

برخلاف استثناها، معمولاً نمی‌توانید خطای سینتکسِ کدی را که در حال تجزیه است، با قرار دادن مستقیم آن داخل بلوک try و except مدیریت کنید؛ زیرا خطای سینتکس در مرحلهٔ تجزیه رخ می‌دهد، در حالی که استثناها هنگام اجرای کد تشخیص داده می‌شوند.

مقایسه خطای نحوی در مرحله تجزیه با استثنای ZeroDivisionError در بلوک try و except

این دو دسته خطا از نظر زمان و ماهیت وقوع تفاوت دارند:

  • خطای نحوی (SyntaxError): به دلیل نقض قوانین نوشتاری زبان و در مرحلهٔ تجزیه رخ می‌دهد.
  • استثنا (Exception): زمانی رخ می‌دهد که یک دستور یا عبارت از نظر نحوی درست است، اما تلاش برای اجرای آن به خطا می‌رسد؛ مانند تقسیم عدد بر صفر (ZeroDivisionError)، باز کردن فایلی که وجود ندارد (FileNotFoundError) یا جمع کردن رشته با عدد (TypeError).
آموزش برنامه نویسی جامع پایتون
آموزش برنامه نویسی جامع پایتون
2,599,000 1,299,500 تومان
50%

نحوه خواندن Traceback و پیدا کردن محل دقیق خطای سینتکس

وقتی مفسر با نحو نامعتبر روبه‌رو می‌شود، پیام خطای SyntaxError را نمایش می‌دهد. برای پیدا کردن محل خطا، باید ۴ جزء اصلی این خروجی را بشناسید:

اجزای خروجی Traceback در فایل theofficefacts.py و اشاره به کامای جاافتاده در خط قبلی
  1. نام فایلی که خطا در آن رخ داده است؛ یا <stdin> اگر کد را در محیط تعاملی وارد کرده باشید.
  2. شمارهٔ خط و تکرار خط کدی که مفسر در آن با مشکل مواجه شده است.
  3. علامت فلش رو به بالا یا Caret (^) در خط زیر کد که نقطهٔ تشخیص مشکل را نشان می‌دهد.
  4. پیام خطا که پس از عبارت SyntaxError: می‌آید و جزئیات مشکل را توضیح می‌دهد.

برای درک نحوهٔ عملکرد مفسر، فایل theofficefacts.py را بررسی می‌کنیم. در این فایل، هنگام ساخت دیکشنری در پایتون یک اشتباه نحوی رخ داده است:

# theofficefacts.py
ages = {
    'pam': 24,
    'jim': 24
    'michael': 43
}
print(f'Michael is {ages["michael"]} years old.')

در خط ۴ این کد، پس از مقدار کلید ‘jim’ علامت کاما (,) جا افتاده است. بااین‌حال، اگر فایل را اجرا کنید، خروجی پیام خطا به شکل زیر خواهد بود:

  File "theofficefacts.py", line 5
    'michael': 43
            ^
SyntaxError: invalid syntax

در خروجی، نام فایل theofficefacts.py است، اما شمارهٔ خط ۵ نمایش داده شده و علامت ^ به کلید ‘michael’ اشاره می‌کند. بسته به خطوط ابتدایی فایل، شمارهٔ خط مربوط به ‘michael’ ممکن است متفاوت باشد. نبودن کاما به‌خودی‌خود خطا نیست؛ همان‌طور که خط ۵ بعد از ۴۳ کاما ندارد و درست است. مفسر وقتی در خط بعدی با ‘michael’ روبه‌رو می‌شود، متوجه مشکل می‌شود، چون نمی‌تواند ارتباط آن را با خط قبل درک کند.

پس مفسر به محل تشخیص خطا اشاره می‌کند و این محل همیشه همان جایی نیست که باید اصلاح شود. هر زمان با SyntaxError مواجه شدید و خطی که پیام خطا نشان می‌دهد ظاهراً سالم به نظر می‌رسد، از محل علامت ^ در کد به عقب برگردید (Moving Backward) و خطوط قبلی را بررسی کنید.

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

دلایل رایج بروز خطای Invalid Syntax در پایتون و روش رفع آن‌ها

شناخت الگوهای پرتکرار خطای سینتکس کمک می‌کند به محض دیدن پیام خطا، علت مشکل را تشخیص دهید. در این بخش، ۶ دلیل رایج بروز این خطا و روش اصلاح هرکدام را مرور می‌کنیم.

۱. جا افتادن کاما یا دونقطه در دیکشنری‌ها، شرط‌ها و حلقه‌ها

همانند جا افتادن کاما بین عناصر دیکشنری که در بخش قبل دیدیم، فراموش کردن علامت دونقطه (:) در انتهای دستورات شرطی و حلقه‌ها نیز از خطاهای پرتکرار در ابتدای یادگیری پایتون است. برای مثال، در کد زیر دونقطه در انتهای دستور if نوشته نشده است:

مقایسه دستور شرطی if بدون علامت دونقطه و نسخه اصلاح‌شده آن در پوسته تعاملی پایتون
>>> if a < 3
  File "<stdin>", line 1
    if a < 3
           ^
SyntaxError: invalid syntax

مثال دیگر، نوشتن حلقه while بدون قرار دادن دونقطه پیش از دستور بعدی است:

>>> while True print('Hello world')
  File "<stdin>", line 1
    while True print('Hello world')
               ^^^^^
SyntaxError: invalid syntax

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

a = 1
if a < 3:
    pass

while True:
    print('Hello world')
    break

۲. استفاده نادرست از عملگر مساوی (=)

در پایتون، علامت تک‌مساوی (=) برای انتساب مقدار به متغیرها کاربرد دارد. نمی‌توان از این علامت برای نسبت دادن مقدار به فراخوانی توابع یا مقادیر ثابت (Literals) استفاده کرد. سه مثال زیر پیام‌های خطای این نوع انتساب را نشان می‌دهند:

خطای انتساب به تابع با عملگر تک‌مساوی در برابر خروجی صحیح True با عملگر دومساوی
>>> len('hello') = 5
  File "<stdin>", line 1
SyntaxError: can't assign to function call

>>> 'foo' = 1
  File "<stdin>", line 1
SyntaxError: can't assign to literal

>>> 1 = 'foo'
  File "<stdin>", line 1
SyntaxError: can't assign to literal

در مثال اول، تلاش شده است عدد ۵ درون فراخوانی تابع len() ذخیره شود. مفسر با پیام can’t assign to function call مانع این کار می‌شود. در مثال دوم و سوم نیز تلاش برای ذخیرهٔ یک مقدار درون رشتهٔ ‘foo’ یا عدد ثابت ۱ باعث بروز خطای can’t assign to literal شده است.

این خطا معمولاً وقتی رخ می‌دهد که قصد مقایسهٔ دو مقدار را دارید، اما به‌اشتباه یکی از علامت‌های مساوی را جا می‌اندازید. برای بررسی برابری دو عبارت، باید از عملگر مقایسه (==) استفاده کنید:

>>> len('hello') == 5
True
آموزش جامع پایتون
آموزش جامع پایتون
799,000 439,450 تومان
45%

۳. اشتباه در نوشتن یا به کار بردن کلمات کلیدی پایتون

کلمات کلیدی (Keywords) در پایتون رزرو شده‌اند و معنای مشخصی دارند. نمی‌توانید از آن‌ها به‌عنوان نام متغیر یا شناسهٔ عادی استفاده کنید. سه خطای رایج در استفاده از کلمات کلیدی عبارت‌اند از:

الف) غلط املایی در نوشتن کلمه کلیدی:

اگر کلمهٔ کلیدی for را به‌اشتباه fro تایپ کنید، مفسر آن را نمی‌شناسد:

>>> fro i in range(10):
  File "<stdin>", line 1
    fro i in range(10):
        ^
SyntaxError: invalid syntax

ب) جا انداختن کلمه کلیدی:

گاهی یکی از کلمات کلیدی ضروری در ساختار دستور را فراموش می‌کنید؛ برای مثال، کلمهٔ in را از حلقهٔ for جا می‌اندازید:

>>> for i range(10):
  File "<stdin>", line 1
    for i range(10):
          ^
SyntaxError: invalid syntax

در این حالت، علامت ^ زیر range قرار می‌گیرد. اگر از محل علامت به عقب برگردید، متوجه می‌شوید که کلمهٔ کلیدی in جا افتاده است. شکل درست هر دو مورد بالا، for i in range(۱۰): است.

ج) استفاده از کلمه کلیدی در جای نادرست:

کلمات کلیدی break و continue برای کنترل جریان حلقه‌ها کاربرد دارند. اگر هنگام ویرایش کد آن‌ها را خارج از حلقه، مثلاً داخل یک دستور if مستقل، قرار دهید، پایتون خطای سینتکس می‌دهد:

>>> names = ['pam', 'jim', 'michael']
>>> if 'jim' in names:
...     print('jim found')
...     break
...
  File "<stdin>", line 3
SyntaxError: 'break' outside loop

>>> if 'jim' in names:
...     print('jim found')
...     continue
...
  File "<stdin>", line 3
SyntaxError: 'continue' not properly in loop

پیام‌های خطای ‘break’ outside loop و ‘continue’ not properly in loop می‌گویند که این کلمات خارج از حلقه به کار رفته‌اند. برای رفع خطا، باید آن‌ها را حذف کنید یا دستور if را درون یک حلقه قرار دهید.

۴. باز ماندن یا ناهماهنگی پرانتزها، براکت‌ها و نقل قول‌ها

بسته نشدن یا ناهماهنگی نقل‌قول‌ها، پرانتزها و براکت‌ها از علت‌های اصلی بروز SyntaxError است؛ به‌ویژه در خطوط طولانی یا ساختارهای تودرتو. هنگام کار با رشته‌ها در پایتون دو خطای متداول رخ می‌دهد:

به هم ریختن رنگ‌بندی کد در رشته دارای تک‌نقل‌قول اضافی و اصلاح آن با جفت نقل‌قول
>>> message = 'don't'
  File "<stdin>", line 1
    message = 'don't'
                   ^
SyntaxError: invalid syntax

>>> message = "This is an unclosed string
  File "<stdin>", line 1
    message = "This is an unclosed string
                                         ^
SyntaxError: EOL while scanning string literal

در مثال اول، تک‌نقل‌قولِ کلمهٔ don’t درون رشته‌ای قرار گرفته که با تک‌نقل‌قول ساخته شده است. این تک‌نقل‌قول باعث می‌شود مفسر رشته را در محل ‘don’ تمام‌شده بداند و حرف t را سینتکس نامعتبر بشناسد. راه‌حل، استفاده از جفت نقل‌قول “don’t” است. در مثال دوم، نقل‌قول رشته تا انتهای خط بسته نشده و پیام خطا صادر شده است. گذاشتن ” در انتهای متن، این خطا را رفع می‌کند.

نبستن براکت لیست‌ها یا پرانتز توابع نیز همین مشکل را ایجاد می‌کند. فایل missing.py را در نظر بگیرید:

# missing.py
def foo():
    return [1, 2, 3

print(foo())

خروجی اجرای این فایل به شکل زیر است:

$ python missing.py
  File "missing.py", line 5
    print(foo())
        ^
SyntaxError: invalid syntax

مفسر خطا را در خط ۵ و روی دستور print(foo()) نشان می‌دهد، چون تا پیش از رسیدن به این دستور منتظر بسته شدن براکت لیستِ خط قبل است. با برگشت به خط قبل و قرار دادن براکت بسته، یعنی return [۱, ۲, ۳]، مشکل برطرف می‌شود.

۵. اشتباه در تعریف و فراخوانی توابع

هنگام تعریف یا صدا زدن توابع، باید قواعد نحوی مشخصی را رعایت کنید. برای نمونه، اگر در انتهای خط تعریف تابع به‌جای دونقطه (:) از نقطه‌ویرگول (;) استفاده کنید، با خطای زیر روبه‌رو می‌شوید:

>>> def fun();
  File "<stdin>", line 1
    def fun();
             ^
SyntaxError: invalid syntax

مورد دیگر، ترتیب قرارگیری آرگومان‌هاست. در تعریف تابع و فراخوانی آن، آرگومان‌های کلیدواژه‌ای (Keyword arguments) باید بعد از آرگومان‌های موقعیتی (Positional arguments) قرار بگیرند. اگر این ترتیب را رعایت نکنید، خطای نحوی رخ می‌دهد:

>>> def fun(a, b):
...     print(a, b)
...
>>> fun(a=1, 2)
  File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument

پیام خطای positional argument follows keyword argument می‌گوید که آرگومان موقعیتی ۲ پس از آرگومان کلیدواژه‌ای a=۱ آمده است. برای اصلاح این ترتیب، فراخوانی را به صورت fun(۱, b=۲) یا fun(۱, ۲) بنویسید.

۶. ناهماهنگی در تورفتگی‌ها (IndentationError و TabError)

بسیاری از زبان‌های برنامه‌نویسی برای مشخص کردن بلوک‌های کد از آکولاد ({}) استفاده می‌کنند، اما پایتون به فضای خالی (Whitespace) و تورفتگی‌ها وابسته است. خطاهای فاصله‌گذاری در پایتون عبارت‌اند از:

ناهماهنگی تورفتگی خط print در فایل indentation.py و نمایش پیام IndentationError
  • IndentationError: وقتی تعداد فاصله‌های خطوط یک بلوک کد با هم تراز نباشند، رخ می‌دهد.
  • TabError: استفادهٔ هم‌زمان و ناهماهنگ از کلید Tab و Space برای ایجاد تورفتگی در یک فایل، این خطا را ایجاد می‌کند.

کد فایل indentation.py را بررسی کنید:

# indentation.py
def foo():
    for i in range(10):
        print(i)
  print('done')

foo()

در این کد، خط مربوط به print(‘done’) فقط ۲ فاصله تورفتگی دارد و با هیچ‌کدام از سطوح قبلی، یعنی ۴ یا ۸ فاصله، هماهنگ نیست. اجرای کد خطای زیر را تولید می‌کند:

$ python indentation.py
  File "indentation.py", line 5
    print('done')
                ^
IndentationError: unindent does not match any outer indentation level

برای رفع خطا، باید تورفتگی خط ۵ را با یکی از بلوک‌های معتبر تراز کنید. مثلاً ۴ فاصله آن را هم‌سطح با حلقهٔ for قرار می‌دهد و ۸ فاصله، آن را داخل حلقه می‌گذارد.

جمع‌بندی سریع پیام‌های خطای سینتکس

جدول زیر برخی پیام‌های SyntaxError را همراه با علت وقوع و راه‌حل هرکدام برای مرور سریع خلاصه می‌کند:

پیام خطاعلت وقوع و راه‌حل سریع
SyntaxError: invalid syntaxخطای عمومی نحو (مانند جا افتادن :، کاما، پرانتز یا غلط املایی در کلمات کلیدی). محل علامت ^ و خط قبلی آن را بررسی کنید.
SyntaxError: can’t assign to function callاستفاده از = برای انتساب مقدار به فراخوانی یک تابع (مثل len(‘a’) = ۱). برای مقایسه از == استفاده کنید.
SyntaxError: can’t assign to literalتلاش برای انتساب مقدار به یک داده ثابت مثل رشته یا عدد (مثل ‘foo’ = ۱). جای متغیر و مقدار را بررسی کنید یا برای مقایسه == بگذارید.
SyntaxError: ‘break’ outside loopاستفاده از دستور break خارج از ساختار حلقه (for یا while).
SyntaxError: ‘continue’ not properly in loopاستفاده از دستور continue خارج از ساختار حلقه.
SyntaxError: EOL while scanning string literalبسته نشدن علامت نقل‌قول (‘ یا “) رشته متنی تا انتهای خط.
SyntaxError: positional argument follows keyword argumentقرار دادن آرگومان موقعیتی بعد از آرگومان کلیدواژه‌ای در تابع (مثل fun(a=۱, ۲)). ابتدا آرگومان‌های موقعیتی را بنویسید.
IndentationError: unindent does not match…ناهماهنگی تعداد فاصله‌های تورفتگی یک خط با بلوک‌های کدِ بالاتر.

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

https://maktabkhooneh.org/mag/python-invalid-syntax/
تصویر مهناز محمدی

مهناز محمدی

0 0 امتیازها
امتیاز دهی به محتوا
مشترک شوید
اطلاع از
guest
0 دیدگاه
قدیمی ترین
جدید ترین دیدگاه با تعداد رای زیاد
مقالات بیشتر
مانیتور نمایش‌دهنده محیط کدنویسی پایتون و ساختار سه‌بعدی تنسورها

پایتورچ (PyTorch) چیست؟ راهنمای کامل PyTorch و Torchvision با کد

مانیتور کامپیوتر در حال نمایش کدهای پایتون و نمودارهای مصورسازی در داشبورد TensorBoard

تنسورفلو (TensorFlow) چیست؟ معرفی معماری، کاربردها و نصب

اجرای همزمان کد پایتون سلنیوم در ویرایشگر و کنترل خودکار مرورگر وب

ساخت ربات اینستاگرام با پایتون؛ آموزش گام‌به‌گام با سلنیوم

محیط ویرایشگر کد پایتون با نمایش عبارت ۲ به علاوه ۳ و تفکیک عملگر و عملوند

عملگرها در پایتون؛ آموزش انواع عملگر با مثال و جدول

رشته (String) در پایتون

رشته (String) در پایتون؛ آموزش کامل، طول رشته و متدها

لاک پشت ترتل در حال رسم اشکال هندسی رنگی

آموزش کتابخانه Turtle در پایتون؛ نصب، دستورات و کدهای آماده