خطای syntax error در پایتون

امیرحسین بیگدلو 12 ماه قبل

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

 

ویدیو پیشنهادی: مدیریت خطا با try و except در پایتون

 

خطای سینتکس نامعتبر(invalid syntax) در پایتون

هنگامی که کد پایتون خود را اجرا می کنید، مفسر ابتدا آن را تجزیه می کند تا کد شما را به کد بایت پایتون تبدیل کند و سپس آن را اجرا کند. مفسر هر گونه سینتکس نامعتبر در پایتون را در اولین مرحله اجرای برنامه، که به عنوان مرحله تجزیه (parsing stage) نیز شناخته می شود، پیدا می کند. اگر مفسر نتواند کد پایتون شما را با موفقیت تجزیه کند، به این معنی است که شما در جایی از کد خود از نحو نامعتبر استفاده کرده اید. مغسر پایتون سعی خواهد کرد به شما نشان دهد که آن خطا کجا رخ داده است.

 

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

 

شما نمی توانید سینتکس نامعتبر در پایتون را مانند سایر استثناها مدیریت کنید. حتی اگر سعی کنید از بلوک try/except در اطراف کد با سینتکس نامعتبر استفاده کنید، باز هم خواهید دید که مفسر یک SyntaxError را ایجاد می کند.

 

دوره پیشنهادی: دوره آموزش رایگان الگوریتم‌نویسی در پایتون

 

خطای Syntax Error در پایتون

هنگامی که مفسر با نحو نامعتبر در کد پایتون مواجه می‌شود، یک استثنای SyntaxError ایجاد می‌کند و یک traceback با اطلاعات مفیدی ارائه می‌کند تا به شما در رفع اشکال خطا کمک کند. در اینجا کدی وجود دارد که حاوی نحو نامعتبر در پایتون است:

 

# theofficefacts.py
ages = {
    'pam': 24,
    'jim': 24
    'michael': 43
}

print(f'Michael is {ages["michael"]} years old.')

 

شما می توانید نحو نامعتبر را در دیکشنری در خط 4 ببینید. ورودی دوم، 'jim'، فاقد کاما است. اگر سعی کردید این کد را همانطور که هست اجرا کنید، traceback زیر را دریافت خواهید کرد:

 

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

 

توجه داشته باشید که traceback خطا را در خط 5 نشان می دهد، نه خط 4. مفسر پایتون فقط می تواند به جایی که برای اولین بار متوجه مشکل شده است اشاره کند. هنگامی که با یک SyntaxError مواجه می شوید و کدی که traceback نمایش میدهد مشکلی ندارد، بهتر است کمی در کدتان به عقب رفته و کدهایی قبلی را نیز بررسی کنید.

 

مقاله پیشنهادی: بررسی خطای value error در پایتون

 

چند مثال از Syntax Error در پایتون

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

 

 

# استفاده نادرست از علامت مساوی

یکی از اشتباهاتی که بسیار متداول است، استفاده نادرست از علامت مساوی (=) است:

>>> 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

 

مثال اول سعی میکند مقدار 5 را در تابع len ذخیره کند که نادرست است. مثال دوم و سوم سعی در ذخیره داده ها در یکدیگر دارد که از نظر منطقی نادرست بوده و باعث ایجاد خطای Syntax Error میشود.

 

اگر میخواهید از علامت مساوی برای مقایسه استفاده کنید، باید دو علامت مساوی بکار ببرید:

>>> len('hello') == 5
True

 

مقاله پیشنهادی: معرفی کلمات کلیدی در پایتون

 

# استفاده نادرست از کلمات کلیدی پایتون

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

 

اگر در استفاده از کلمه کلیدی اشتباه املایی داشته باشید، یک SyntaxError دریافت خواهید کرد:

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

 

یکی دیگر از مشکلات رایج در مورد کلمات کلیدی زمانی است که شما آنها را به طور کلی نمی نویسید:

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

 

در کد بالا کلمه کلیدی in نوشته نشده است.

 

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

>>> 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 و continue خارج از حلقه استفاده شده است.

 

 

# استفاده نادرست از پرانتزها یا براکت یا نقل قول ها

اغلب، علت Syntax Error در کد پایتون، پرانتز، براکت یا نقل قول های ناهماهنگ است. تشخیص این موارد در خطوط بسیار طولانی پرانتزهای تو در تو یا بلوک های چند خطی طولانی تر، دشوار است. می توانید با کمک traceback پایتون، نقل قول های نامتناسب یا گم شده را پیدا کنید:

 

>>> 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

 

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

 

همچنین مراقب هماهنگی براکت ها یا پرانتز ها نیز باشید:

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

print(foo())

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

 

مقاله پیشنهادی: درک کامل تورفتگی(indentation) در پایتون

 

# ناهماهنگی در تورفتگی ها

دو طبقه فرعی از SyntaxError وجود دارد که به طور خاص با مسائل تورفتگی سروکار دارد:

  1. IndentationError
  2. TabError

 

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

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

foo()

 

ممکن است تشخیص این مشکل کمی سخت باشد اما خط 5 فقط 2 فاصله تورفتگی دارد. اگر کد بالا را اجرا کنید با خطا مواجه خواهید شد:

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

 

ویدیو پیشنهادی: تابع در پایتون

 

# ساخت و فراخوانی توابع

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

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

 

علاوه بر این، آرگومان های کلیدواژه هم در تعاریف تابع و هم در فراخوانی تابع باید به ترتیب درست باشند. آرگومان های کلیدواژه همیشه بعد از آرگومان های موقعیتی قرار می گیرند. عدم استفاده از این سفارش منجر به خطای نحوی می شود:

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

 

در اینجا، یک بار دیگر، پیام خطا به شما کمک می کند که بفهمید دقیقاً چه مشکلی در کد وجود دارد.

 

 

نتیجه گیری

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

مطالب مشابه



مونگارد