Python'da "Invalid Syntax" xatosini tuzatish (8 ta keng tarqalgan sabab)
Python'dagi invalid syntax xatosi joningizga tegdimi? 8 ta keng tarqalgan sabab, tezkor tuzatish jadvali va uni bir necha daqiqada hal qilishga yordam beradigan debugging maslahatlari bilan tanishing.
Muallif: Kimberly Fessel
Abstrakt tarzda aytganda, kodingizni Python bilan bo'ladigan, ko'rsatmalardan iborat suhbat deb tasavvur qilishingiz mumkin. Ko'pincha bu suhbat silliq kechadi va mantiqiy ketma-ketlikda davom etadi, ammo goh-goh Python sizni shunchaki tushuna olmaydi. Bunday paytlarda kodingizda invalid syntax (noto'g'ri sintaksis) bo'lishi mumkin. Python bilan yana bir-biringizni tushunishingiz uchun anglashilmovchilik manbasini aniqlab, muammoni tuzatishingiz kerak bo'ladi.
Ushbu maqolada invalid syntax'ni Python'ning SyntaxError'i orqali, jumladan uning keng tarqalgan sabablari va yechimlari bilan birga ko'rib chiqamiz. Python sintaksisingiz "tarjimada yo'qolib qolmasligi" uchun sizga xato xabarini o'qishni va boshqa debugging maslahatlarini ko'rsatib o'tamiz.
SyntaxError exception'iga umumiy nazar
Ingliz tili kabi tabiiy tillar singari Python'ning ham grammatik qoidalari bor va ular umumiy qilib sintaksis deb ataladi. Ushbu qoidalardan birini buzsangiz, SyntaxError exception'ini olasiz. Python interpreter'i parsing bosqichida invalid syntax'ga duch kelganda kodingizni parse qila olmasligini aniqlaydi va zarar ko'rgan kod bajarilishidan oldinroq xato raise qiladi.
Quyida yana bir nechta syntax error misollarini ko'rasiz, ammo hozircha nimaga duch kelishingiz mumkinligini ko'rsatadigan qisqa snippet:
x = 5
if x = 5:
print(x)
# Expected result:
# File "<python-input-0>", line 3
# if x = 5:
# ^^^^^
# SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of # '='?
Sizni noto'g'ri sintaksis haqida ogohlantirishadi, yangiroq Python versiyalari esa hatto foydali taklif ham beradi.
Qator raqami ko'rsatilgan Python xato xabarini qanday o'qish kerak
Invalid syntax bilan bog'liq SyntaxError'ning keng tarqalgan sabablariga sho'ng'ishdan oldin xato xabarini qanday o'qishni tushunib olishga biroz vaqt ajratishga arziydi. Python dasturchilari bu xabarlarga tayanadi, chunki ular kodingizdagi har qanday muammoni topish va tuzatish uchun qimmatli ishoralar bo'lib xizmat qiladi.
Mana xato xabariga misol:
File "example.py", line 4
if item_cost <= bank_balance
Xato xabarining birinchi qatorida .py fayl nomini (masalan, example.py) yoki interaktiv muhitda ishlayotgan bo'lsangiz, kiritish nomini (masalan, <python-input-0>) ko'rasiz. Keyin Python sintaksis muammosini aniqlagan qator raqami keladi. Bu debugging uchun boshlang'ich nuqtangiz, ammo qator raqami har doim ham haqiqiy xato qayerda boshlanganini aytmasligini yodda tuting.
So'ngra xato xabarining ikkinchi qatorida Python sizga bug'ingiz bo'lishi mumkin bo'lgan tegishli manba kodini ko'rsatadi. Undan keyin sintaksis muammongiz bilan bog'liq joylarni belgilab beruvchi caret (^) belgilari keladi. Yana bir bor ta'kidlaymiz: caret'lar odatda ancha aniq bo'ladi, lekin aynan xatongizni ko'rsatishiga kafolat yo'q.
Nihoyat, xabarning oxirgi qatorida exception type'ini (masalan, SyntaxError, KeyError) va xatongizni tavsiflovchi foydali xabarni (masalan, expected ':') topasiz.
Python kodingizdagi xatolarni aniqlash va tuzatish uchun bu qismlarning har biridan ishora sifatida foydalaning. Best practice sifatida ko'rsatilgan qatorni ham, undan oldingi qatorlarni ham tekshiring, chunki muammo yuqoriroqda boshlangan bo'lishi mumkin. Endi Python SyntaxErrors'ining bir nechta keng tarqalgan sabablarini ko'rib chiqib, bu ishoralarni amalda qo'llaymiz.
SyntaxError'ning keng tarqalgan sabablari
Hamma SyntaxError exception'lari ham "invalid syntax" xabari bilan kelavermaydi, ammo barcha SyntaxError: invalid syntax javoblari SyntaxErrors hisoblanadi. Ushbu bo'limda syntax error'larning eng keng tarqalgan sabablarini ko'rib chiqamiz va Python odatda qaysi hollarda xato xabariga "invalid syntax"ni qo'shishini qayd etamiz.
Tushib qolgan ikki nuqta
Python indentation qilingan blokni boshlaydigan statement'lardan keyin ikki nuqta, ya'ni : qo'yilishini talab qiladi, masalan:
-
if,elif,else -
for,while -
def -
try,except
Bu ikki nuqtani unutish nafaqat keng tarqalgan xato, balki Python SyntaxError raise qilishining odatiy sababi hamdir. Ikki nuqta tushib qolganda bu quyidagicha ko'rinadi:
bank_balance = 100
item_cost = 20
if item_cost <= bank_balance
print("Affordable")
bank_balance = bank_balance - item_cost
# Expected result:
# File "<python-input-1>", line 4
# if item_cost <= bank_balance
# ^
# SyntaxError: expected ':'
Python'ning yangi versiyalari tushib qolgan ikki nuqtani aniqlab berishi ehtimoli katta, ammo eskiroq implementatsiyalar hali ham SyntaxError: invalid syntax deb ko'rsatishi mumkin. Bu xatoni tuzatish uchun ikki nuqta tushib qolmaganini tekshiring va indentation qilingan statement bloklaridan oldin ularni qo'shing.
Tushib qolgan oddiy, kvadrat yoki figurali qavslar
Python kodida list'lar, dictionary'lar, funksiya chaqiruvlari va boshqa joylarda oddiy, kvadrat va figurali qavslarni ko'p uchratasiz. Faqat shuni unutmangki, bu delimiter'lardan birini ochgan bo'lsangiz, uni yopishingiz ham kerak. Python'da delimiter juftliklarining tushib qolishi yoki bir-biriga mos kelmasligi SyntaxError'ning yana bir odatiy sababidir.
Agar Python'da list yaratmoqchi bo'lsangiz-u, lekin list'ingizning yopuvchi kvadrat qavsini unutsangiz, xato olasiz:
drinks = ["milk", "juice", "water"
print(drinks)
# Expected result:
# File "<python-input-2>", line 1
# drinks = ["milk", "juice", "water"
# ^
# SyntaxError: '[' was never closed
Agar kvadrat qavsni adashib oddiy qavs bilan juftlasangiz ham xato olasiz:
drinks = ["milk", "juice", "water")
print(drinks)
# Expected result:
# File "<python-input-3>", line 1
# drinks = ["milk", "juice", "water")
# ^
# SyntaxError: closing parenthesis ')' does not match opening parenthesis '['
Bu yerda ham eskiroq Python versiyalari bilan ishlaganda SyntaxError: invalid syntax xabarini ko'rishingiz mumkin.
Ichma-ich joylashuvi juda chuqur bo'lgan kod tuzilmalari bilan ishlaganda bu muammo ayniqsa qiyinlashadi. Delimiter'larni ajratib ko'rsatadigan muharrir yordamida juftliklar mos kelishini tekshirib ko'ring va eng ichki juftlikdan tashqariga qarab harakatlaning.
Tushib qolgan qo'shtirnoqlar
Tushib qolgan yoki mos kelmaydigan delimiter'larga o'xshab, qo'shtirnoqlar tushib qolganda ham SyntaxError olasiz. String literal yaratayotganda qo'shtirnoq uslubi o'z jufti bilan mos kelishini ham tekshirishingiz kerak:
-
Yakka qo'shtirnoq,
'...' -
Qo'sh qo'shtirnoq,
"..." -
Uchtalik qo'shtirnoq,
'''...'''yoki"""..."""
Qo'shtirnoqlarni tushirib qoldirish oson. Bu quyidagicha ko'rinishi mumkin:
message = "Hello, Kim!
print(message)
# Expected result:
# File "<python-input-4>", line 1
# message = "Hello, Kim!
# ^
# SyntaxError: unterminated string literal (detected at line 1)
Yopilmagan string'lar Python'ni SyntaxError raise qilishga majbur qiladi. String literal'lar ichidagi qo'shtirnoqlarga ham alohida e'tibor bering. Quyidagi misolda ichki " atrofdagi string'ni muddatidan oldin yopib qo'yadi, natijada hello string'dan tashqarida qoladi va invalid syntax yuzaga keladi:
reply = "She said, "hello" back."
print(reply)
# Expected result:
# File "<python-input-5>", line 1
# reply = "She said, "hello" back."
# ^^^^^
# SyntaxError: invalid syntax
String ichidagi qo'shtirnoqlar uchun boshqa turdagi qo'shtirnoqdan foydalanish ('She said, "hello" back.') yoki escape qilish ("She said, \"hello\" back.") kerak. Uchtalik qo'shtirnoqli multiline string'larning o'z qo'shtirnoq qoidalari va o'ziga xos xatolik holatlari bor.
= va ==
Python'da bitta tenglik belgisi, ya'ni =, assignment operatori hisoblanadi. Undan o'zgaruvchilarga muayyan qiymatlarni berish uchun foydalaning, masalan, x = 2. Ikkita tenglik belgisi, ya'ni == esa tenglikni taqqoslash operatorini bildiradi. U ikki qiymatni taqqoslaydi va ularning tengligiga qarab True yoki False qaytaradi.
Agar elementlarni taqqoslayotganda adashib bitta tenglik belgisini ishlatsangiz, invalid syntax haqida ogohlantiruvchi SyntaxError olasiz:
user = "guest"
while user = "guest":
print("Guest access.")
user = input("Enter username: ")
# Expected result:
# File "<python-input-6>", line 3
# while user = "guest":
# ^^^^^^^^^^^^^^
# SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of # '='?
Aynan shu xatoni biz SyntaxError: invalid syntax'ni ilk bor tanishtirganimizda ko'rgan edingiz. Muammoni tuzatish uchun while statement'idagi taqqoslashda ikkita tenglik belgisiga o'ting (user == "guest").
Bu muammo ko'pincha if, elif va while shartlarida, shuningdek Boolean ifodalarda uchraydi, shuning uchun = va == bilan bog'liq muammolarga duch kelsangiz, o'sha joylarni tekshiring. Shuni ham yodda tutingki, bitta tenglik belgisi, ya'ni = Python'da to'g'ri sintaksis, lekin undan taqqoslash uchun emas, balki assignment uchun foydalanishingiz kerak.
List/dictionary elementlari orasida tushib qolgan vergul
List'lar va dictionary'lar kolleksiya elementlarini ajratish uchun vergullarni talab qiladi, masalan, mos ravishda [1, 2, 3] va {"California": "West", "Ohio": "Midwest"}. Elementlar orasidagi vergulni unutish ham SyntaxError'ga olib kelishi mumkin bo'lgan yana bir keng tarqalgan xato:
prices = [19, 14 39]
print(prices)
# Expected result:
# File "<python-input-7>", line 1
# prices = [19, 14 39]
# ^^^^^
# SyntaxError: invalid syntax. Perhaps you forgot a comma?
Dictionary'lar, tuple'lar, set'lardagi elementlar yoki funksiya chaqiruvidagi argumentlar orasida vergulni tushirib qoldirsangiz ham shunga o'xshash xatolarni ko'rasiz. Bunga bog'liq SyntaxError'lardan qochish uchun kolleksiyalar va argumentlarni diqqat bilan tekshiring.
Noto'g'ri o'zgaruvchi nomlari va reserved keyword'lar
Python o'zgaruvchilarida odatda harflar, raqamlar va pastki chiziqlar ishlatiladi, ammo ular raqam bilan boshlana olmaydi. O'zgaruvchilarni nomlash qoidalarini buzsangiz, Python SyntaxError raise qilishi mumkin:
2nd_place = "Olivia"
print(2nd_place)
# Expected result:
# File "<python-input-8>", line 1
# 2nd_place = "Olivia"
# ^
# SyntaxError: invalid decimal literal
Yaroqsiz o'zgaruvchi nomlarini tuzatish uchun sonlarni so'z bilan yozib ko'ring (second_place) va taqiqlangan belgilarni olib tashlang.
Python'da oddiy o'zgaruvchi nomi sifatida ishlatib bo'lmaydigan reserved keyword'lar ro'yxati ham bor, masalan, if, for, while, class, True va None. Ulardan foydalanishga urinish ham SyntaxError'ga olib kelishi mumkin:
class = "Introduction to Python"
print(class)
# Expected result:
# File "<python-input-9>", line 1
# class = "Introduction to Python"
# ^
# SyntaxError: invalid syntax
Python'ning reserved keyword'lari ro'yxatini built-in keyword modulidagi kwlist'ni tekshirib ko'rishingiz mumkin:
import keyword
print(keyword.kwlist)
# Expected result:
# ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await',
# 'break', 'class', 'continue', 'def', 'del', 'elif', 'else',
# 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in',
# 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return',
# 'try', 'while', 'with', 'yield']
SyntaxError raise bo'lishining oldini olish uchun bu keyword'larning hech birini o'zgaruvchi nomi sifatida ishlatmasligingiz kerak.
Noto'g'ri indentation va tab xatolari
Ba'zi boshqa dasturlash tillaridan farqli o'laroq, Python kod bloklarini belgilash uchun indentation'ga tayanadi. Python kodni statement'ingizning bir qismi deb hisoblashi uchun if, for, while, def va hokazolardan keyingi kodni indentation bilan surishingiz shart; xuddi shuningdek, indentation talab qilinmaydigan qatorlarga indent qo'shsangiz ham noto'g'ri indentation hosil bo'ladi.
Agar bu indentation'ni unutsangiz, SyntaxError'ning subclass'i bo'lgan IndentationError'ni olishingiz mumkin:
score = 83
if score >= 65:
print("You passed!")
# Expected result:
# File "<python-input-11>", line 4
# print("You passed!")
# ^^^^^
# IndentationError: expected an indented block after 'if' statement on # line 3
Kutilmagan indentation qo'shsangiz ham shunga o'xshash xato olasiz:
score = 83
print("You passed!")
# Expected result:
# File "<python-input-12>", line 2
# print("You passed!")
# IndentationError: unexpected indent
Agar TabError'ni ko'rib qolsangiz, u ham SyntaxError ierarxiyasiga kiradi. PEP 8 har bir indentation darajasi uchun to'rtta probel ishlatishni tavsiya qiladi va tab'lardan ko'ra probellarni afzal ko'radi. Ko'plab muharrirlarni Tab tugmasini bosganingizda avtomatik ravishda to'rtta probel qo'yadigan qilib sozlashingiz ham mumkin.
print statement'i (Python 2 va 3 dagi invalid syntax)
Python 3 2008-yil oxirlarida chiqdi, Python 2 esa 2020-yilda end-of-life'ga yetdi. Legacy code yoki eskiroq tutorial'larni ko'rib chiqayotgan bo'lmasangiz, bugungi kunda bu versiya yangilanishiga oid tafsilotlar bilan shug'ullanishingizga ehtimol to'g'ri kelmaydi. Shunday bo'lsa-da, Python 2 dan Python 3 ga o'tgan dasturchilar uchun eng ko'zga tashlanadigan o'zgarishlardan biri print statement'ining sintaksisi bo'ldi.
Python 2 da print statement'lari quyidagicha ko'rinardi:
print "Hello, from Python 2!"
Python 3 esa bugun biz biladigan print() funksiyasiga o'tdi:
print("Hello, from Python 3!")
Python 2 uslubidagi print statement'ini Python 3 da ishga tushirishga urinsangiz, SyntaxError olasiz:
print "Hello, from Python 2!"
# Expected result:
# File "<python-input-13>", line 1
# print "Hello, from Python 2!"
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# SyntaxError: Missing parentheses in call to 'print'. Did you mean
# print(...)?
Bunday SyntaxError'larni tuzatish uchun Python 3 ning print() funksiyasidan foydalaning.
SyntaxError'ni tuzatish uchun tezkor qidiruv jadvali
Biz sizga SyntaxError'larning ko'plab turli sabablarini keltirdik. Mana o'sha Python muammolarini umumlashtiradigan va ularni to'g'ri sintaksis bilan tuzatishga yordam beradigan ixcham ma'lumotnoma jadvali:
| Xato/ishora | Ehtimoliy sabab | Qayerni tekshirish kerak | Tuzatish |
|---|---|---|---|
| expected ':' | Tushib qolgan ikki nuqta | if, for, def va h.k. oxiri | : qo'shing |
| '[' was never closed | Tushib qolgan delimiter | Mos [], (), {} juftliklari | Delimiter'ni yoping |
| unterminated string literal | Tushib qolgan qo'shtirnoq | Ochuvchi/yopuvchi qo'shtirnoqlar | Mos qo'shtirnoq qo'shing |
| Maybe you meant '==' | Taqqoslash uchun = ishlatilgan | Shartlar/Boolean ifodalar | == bilan almashtiring |
| Perhaps you forgot a comma? | Ajratuvchi vergul tushib qolgan | Kolleksiyalar/argumentlar | Vergul qo'shing |
| invalid decimal literal | Noto'g'ri o'zgaruvchi nomi | Raqam bilan boshlanadigan o'zgaruvchilar | O'zgaruvchi nomini o'zgartiring |
| IndentationError | Noto'g'ri indentation | Kod bloklari | Indentation qo'shing/olib tashlang |
| Missing parentheses in call to 'print' | Python 2 print sintaksisi | Legacy print statement'i | print() dan foydalaning |
Debugging maslahatlari va vositalari
SyntaxError'lar soni juda ko'p bo'lishi mumkinligi sababli debugging uchun bir nechta aqlli usullarni qo'llashni xohlaysiz. Python kodingizni qo'lda debug qilasizmi yoki linter'lar va IDE'lar kabi vositalarga tayanasizmi, quyidagi maslahatlarni yodda tuting.
Invalid syntax'ni qo'lda debug qilish
Sintaksis muammolarini aniqlash uchun Python beradigan har qanday xato xabarini sinchiklab o'qib chiqishingiz kerak. Xabarda ko'rsatilgan qator raqamidan boshlang'ich nuqta sifatida foydalanishni unutmang, ammo xato qayerda yuz berganini topish uchun zarur bo'lsa, undan oldingi barcha qatorlarni ham tekshiring. Delimiter'lar, qo'shtirnoqlar va indentation'lar kodlashdagi xatolarning anchagina qismiga sabab bo'lishi bilan mashhur, shuning uchun invalid syntax'ga duch kelganda ularni ham qayta tekshiring.
Kodni nusxalab qo'yishda muammolarga duch kelishingiz mumkin. Boshqa joydan nusxalab olgan har qanday shubhali belgilarni qaytadan qo'lda yozing. Bundan tashqari, kodingizni xato beradigan eng kichik qismgacha qisqartirib, bug'larni ajratib olish foydali bo'lishi mumkin. Muammoni qayerdan izlashni bilish xatoni tuzatishdagi birinchi qadamingizdir.
Linter'lar va IDE'lar yordamida xatolarning oldini olish
Agar Visual Studio Code, PyCharm yoki Spyder kabi integrated development environment (IDE) yoki kod muharriridan foydalansangiz, mashhur avtomatlashtirilgan sintaksis tekshirish vositalaridan foydalanish imkoniga ega bo'lasiz. Bu vositalar syntax highlighting yordamida kodni yozayotganingizdayoq muammolarni aniqlashga yordam beradi. Buni hujjat yozayotgandagi avtomatik imlo tekshiruvi kabi tasavvur qiling. IDE yoki muharrir kodingizni ishga tushirib, SyntaxError'ga duch kelishingizdan oldinroq, real vaqt rejimida tushib qolgan delimiter'lar yoki noto'g'ri indentation haqida ogohlantirishi mumkin.
Bundan tashqari, kodingizni Ruff, Pylint yoki Flake8 kabi linter orqali tekshirishingiz mumkin. Ko'pincha linter'ni kod muharriringizga integratsiya qilib, kodingizni bajarmasdan tahlil qildirishingiz mumkin. Linter sintaksis muammolarini, aniqlanmagan o'zgaruvchilarni, PEP 8 muammolarini va boshqa ko'plab kamchiliklarni aniqlab bera oladi.
Xulosa
SyntaxError exception'lari, jumladan invalid syntax bilan bog'liq muammolar, Python'ning grammatik qoidalaridan birini buzganingizda va u kodingizni parse qila olmaganida yuzaga keladi. Python'ni o'rganish jarayonida sintaksis muammolarining ko'plab turli sabablari borligini ko'rasiz: masalan, funksiya nomidan keyin ikki nuqtani unutish, qavsni tushirib qoldirish, == o'rniga = ishlatish, noto'g'ri indentation qo'yish yoki o'zgaruvchilarga yaroqsiz nomlar berish. Yuzaga kelgan har qanday sintaksis muammosini aniqlash va oxir-oqibat tuzatish uchun Python'ning foydali xato xabarlaridan foydalaning, shuningdek kod yozayotganingizdayoq ehtimoliy xatolar haqida xabar beradigan built-in vositalar uchun IDE yoki linter'dan foydalanishni ko'rib chiqing.
Python'dagi invalid syntax xatolarini topib, tuzata olaman deb o'ylaysizmi? Ushbu prompt'dan boshlab AI Tutor bilan muloqot qiling va ko'nikmalaringizni sinab ko'ring: