پایتون به داشتن سینتکس ساده شناخته میشود، اما پیام SyntaxError: invalid syntax و توقف کامل برنامه از مشکلات رایج هنگام کدنویسی است. این خطا زمانی رخ میدهد که بخشی از کد با قوانین ساختاری پایتون همخوانی نداشته باشد و مفسر نتواند آن را درک کند.
در ابتدای مسیر آموزش زبان برنامه نویسی پایتون یا هنگام ورود از یک زبان برنامهنویسی دیگر به پایتون، برخورد با این خطا طبیعی است. مفسر پایتون تلاش میکند محل خطا را در خروجی نشان دهد. بااینحال، گاهی خطی که به آن اشاره میکند ظاهراً مشکلی ندارد و پیدا کردن ایراد را دشوار میکند.
در این راهنما یاد میگیرید که خطای سینتکس در چه مرحلهای رخ میدهد، چطور با خواندن دقیق Traceback محل واقعی خطا را پیدا کنید و چگونه رایجترین دلایل بروز خطای Invalid syntax در پایتون را برطرف کنید.
خطای Invalid Syntax در پایتون چیست و چه زمانی رخ میدهد؟
وقتی کد پایتون را اجرا میکنید، مفسر ابتدا آن را تجزیه (Parse) و سپس اجرا میکند. مفسر هرگونه نحو نامعتبر را در همین مرحلهٔ اول، یعنی «مرحله تجزیه» (Parsing)، شناسایی میکند. به همین دلیل، خطاهای نحوی را خطای تجزیه (Parsing Error) نیز مینامند.
اگر ساختار دستورات شما با قوانین تعریفشده در زبان برنامه نویسی پایتون هماهنگ نباشد، مفسر نمیتواند کد را تجزیه کند و اجرای برنامه بلافاصله متوقف میشود. علاوه بر اشتباهات تایپی و ساختاری، تغییر قوانین سینتکس بین نسخههای مختلف پایتون نیز میتواند هنگام اجرای کدهای قدیمیتر باعث بروز خطای SyntaxError شود.
تفاوت SyntaxError با Exception؛ چرا try و except کار نمیکند؟
برخلاف استثناها، معمولاً نمیتوانید خطای سینتکسِ کدی را که در حال تجزیه است، با قرار دادن مستقیم آن داخل بلوک try و except مدیریت کنید؛ زیرا خطای سینتکس در مرحلهٔ تجزیه رخ میدهد، در حالی که استثناها هنگام اجرای کد تشخیص داده میشوند.

این دو دسته خطا از نظر زمان و ماهیت وقوع تفاوت دارند:
- خطای نحوی (SyntaxError): به دلیل نقض قوانین نوشتاری زبان و در مرحلهٔ تجزیه رخ میدهد.
- استثنا (Exception): زمانی رخ میدهد که یک دستور یا عبارت از نظر نحوی درست است، اما تلاش برای اجرای آن به خطا میرسد؛ مانند تقسیم عدد بر صفر (ZeroDivisionError)، باز کردن فایلی که وجود ندارد (FileNotFoundError) یا جمع کردن رشته با عدد (TypeError).
نحوه خواندن Traceback و پیدا کردن محل دقیق خطای سینتکس
وقتی مفسر با نحو نامعتبر روبهرو میشود، پیام خطای SyntaxError را نمایش میدهد. برای پیدا کردن محل خطا، باید ۴ جزء اصلی این خروجی را بشناسید:

- نام فایلی که خطا در آن رخ داده است؛ یا <stdin> اگر کد را در محیط تعاملی وارد کرده باشید.
- شمارهٔ خط و تکرار خط کدی که مفسر در آن با مشکل مواجه شده است.
- علامت فلش رو به بالا یا Caret (^) در خط زیر کد که نقطهٔ تشخیص مشکل را نشان میدهد.
- پیام خطا که پس از عبارت 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 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) استفاده کرد. سه مثال زیر پیامهای خطای این نوع انتساب را نشان میدهند:

>>> 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
۳. اشتباه در نوشتن یا به کار بردن کلمات کلیدی پایتون
کلمات کلیدی (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) و تورفتگیها وابسته است. خطاهای فاصلهگذاری در پایتون عبارتاند از:

- 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… | ناهماهنگی تعداد فاصلههای تورفتگی یک خط با بلوکهای کدِ بالاتر. |
دقت به پیام خطا و بررسی خط قبل از علامت ^، سرعت شما را در رفع خطاهای نحوی بالا میبرد. با تمرین مداوم، دستتان به نوشتن ساختارهای درست عادت میکند و خطاهای تایپی کمتری دارید.