أوّل خطأ يقابل أي متعلّم بايثون تقريبًا هو
SyntaxError: invalid syntax. الخبر الجيد: هو أسهل الأخطاء حلًّا، لأن
بايثون يخبرك بمكان المشكلة بالضبط — إذا عرفت كيف تقرأ الرسالة.
كيف تقرأ رسالة الخطأ
File "app.py", line 3
if age > 18
^
SyntaxError: expected ':'
ثلاث معلومات ذهبية في كل رسالة:
- اسم الملف ورقم السطر (
line 3) — أين توقّف بايثون. - السهم
^— النقطة التي فشل عندها فهم الجملة. - الوصف — في بايثون الحديث يكون محددًا ومفيدًا مثل
expected ':'.
💡 مهم:
SyntaxErrorيُكتشف قبل تشغيل أي سطر من برنامجك — لذلك لن تنفع طباعة
الأسباب السبعة الأكثر شيوعًا
| السبب | مثال خاطئ | الصحيح |
|---|---|---|
نسيان النقطتين : | if age > 18 | if age > 18: |
| قوس لم يُغلق | print(sum([1, 2) | print(sum([1, 2])) |
| اقتباس لم يُغلق | name = "أحمد | name = "أحمد" |
= بدل == في الشرط | if x = 5: | if x == 5: |
| خطأ إزاحة | مسافات غير متسقة | 4 مسافات دائمًا |
| كلمة محجوزة كاسم | class = "A" | grade = "A" |
| صيغة بايثون 2 | print "hi" | print("hi") |
الحلول خطوة بخطوة
1) نقطتان منسيّتان — السبب الأول بلا منازع
كل سطر يفتح كتلة جديدة في بايثون يجب أن ينتهي بنقطتين:
if score >= 60: # ✅
for i in range(10): # ✅
def greet(name): # ✅
while True: # ✅
2) قوس أو اقتباس لم يُغلق — انظر للسطر السابق
هذا هو السبب الذي يخدع الجميع: بايثون يشير إلى سطرٍ يبدو سليمًا، بينما القوس المفتوح في السطر الذي قبله:
total = sum([1, 2, 3 # ❌ القوسان لم يُغلقا هنا
print(total) # ← لكن الخطأ سيُشار إليه هنا!
بايثون الحديث (3.10+) صار يخبرك صراحة:
SyntaxError: '[' was never closed — مع رقم السطر الأصلي.
3) IndentationError — قصة المسافات
IndentationError: expected an indented block after 'if' statement
قواعد الإزاحة الذهبية:
- بعد أي سطر ينتهي بـ
:يجب أن يكون السطر التالي مُزاحًا للداخل. - استخدم 4 مسافات دائمًا — ولا تخلط Tab مع Space أبدًا.
- في VS Code فعّل إعداد "Render Whitespace" لترى المسافات بعينك.
if logged_in:
print("أهلًا!") # ✅ 4 مسافات
4) = إسناد و == مقارنة
if x = 5: # ❌ SyntaxError
if x == 5: # ✅ مقارنة
قائمة تحقّق سريعة
- هل السطر الذي يفتح كتلة ينتهي بـ
:؟ - هل كل
(و[و{و"له إغلاق مطابق؟ (افحص السطر السابق أيضًا) - هل استخدمت
==للمقارنة داخل الشروط؟ - هل الإزاحة 4 مسافات متسقة في كل الملف؟
- هل استخدمت كلمة محجوزة (
class,def,if…) اسمًا لمتغيّر؟
الخلاصة
SyntaxError ليس عدوًّا — هو مصحح إملائي يوقفك قبل تشغيل كود مكسور. اقرأ
رقم السطر، انظر للسهم ^، وافحص السطر المُشار إليه والسطر الذي قبله،
وستحلّه في أقل من دقيقة.
بعد إتقان قراءة الأخطاء، تعمّق في مسار بايثون الكامل، أو راجع أخطاء بايثون الشائعة الأخرى و جدول أنواع الأخطاء في جافاسكريبت للمقارنة.