خطأ SyntaxError: invalid syntax يعني أن بايثون وجدت صياغة لا تطابق قواعد اللغة، لذلك لم تستطع تحليل الكود. ابدأ برقم السطر في رسالة الخطأ، ثم انظر إلى علامة ^ لتعرف الموضع الذي اكتشفت عنده بايثون المشكلة. وإذا بدا السطر صحيحًا، افحص السطر السابق؛ فقد يكون السبب قوسًا أو علامة اقتباس غير مغلقة.
أشهر الأسباب هي نسيان : بعد if أو for أو def، استخدام = بدل == داخل شرط، عدم إغلاق الأقواس أو الاقتباسات، استخدام كلمة محجوزة كاسم متغير، أو كتابة أمر Terminal مثل pip install داخل مفسر بايثون >>>. هذا هو الدرس 10 من سلسلة مشكلة وحل، وسنصلح كل حالة بخطوات قصيرة وأمثلة عملية.
{alertInfo} الحل السريع: اقرأ رقم السطر، ثم علامة^، وافحص السطر نفسه والسطر السابق. بعد ذلك راجع:والأقواس والاقتباسات و=مقابل==. لا تعدّل عدة أشياء عشوائيًا في الوقت نفسه.
{getToc} $title={محتوى المقال}
ما معنى SyntaxError: invalid syntax في بايثون؟
SyntaxError يعني أن الكود يخالف قواعد كتابة بايثون بطريقة تمنع المفسر من فهمه.
الكود الخاطئ:
age = 20
if age >= 18
print("Adult")
سبب المشكلة: سطر if الذي يبدأ كتلة كود يجب أن ينتهي بالنقطتين :. في إصدارات بايثون الحديثة قد تظهر رسالة أدق مثل SyntaxError: expected ':' بدل العبارة العامة invalid syntax.
الكود الصحيح:
age = 20
if age >= 18:
print("Adult")
السبب الأول: نسيان النقطتين بعد if أو for أو while أو def
من أشهر أخطاء الصياغة نسيان : في نهاية سطر يبدأ كتلة جديدة مثل if وfor وwhile وdef وclass.
الكود الخاطئ:
items = [
"A",
"B",
"C"
]
for item in items
print(item)
سبب المشكلة: سطر for ناقصه :.
الكود الصحيح:
items = [
"A",
"B",
"C"
]
for item in items:
print(item)
السبب الثاني: قوس غير مغلق
الكود الخاطئ:
print("Hello Python"
سبب المشكلة: قوس الاستدعاء ( لم يُغلق.
الكود الصحيح:
print("Hello Python")
في Python الحديثة قد تظهر رسالة أكثر تحديدًا مثل SyntaxError: '(' was never closed. لذلك لا تتوقع أن تكون كل أخطاء الصياغة مكتوبة حرفيًا بصيغة invalid syntax.
السبب الثالث: علامة اقتباس غير مغلقة
الكود الخاطئ:
print("مرحبا بك في بايثون)
سبب المشكلة: النص بدأ بعلامة اقتباس ولم يُغلق.
الكود الصحيح:
print("مرحبا بك في بايثون")
في Python الحديثة ستظهر في كثير من الحالات رسالة أكثر تحديدًا مثل:
SyntaxError: unterminated string literal
وهذا يعني أن String لم يكتمل. لذلك لا نقول إن كل أخطاء الاقتباس تظهر دائمًا حرفيًا كـinvalid syntax.
السبب الرابع: استخدام = بدل == داخل الشرط
= للإسناد، بينما == للمقارنة.
الكود الخاطئ:
age = 18
if age = 18:
print("العمر 18")
سبب المشكلة: وضعنا عامل الإسناد داخل شرط يحتاج مقارنة. في Python الحديثة قد تقترح رسالة الخطأ استخدام ==.
الكود الصحيح:
age = 18
if age == 18:
print("العمر 18")
السبب الخامس: كتابة تركيب غير صحيح
الكود الخاطئ:
x = 10
result = x + * 2
print(result)
سبب المشكلة: لا يمكن وضع + و* بهذه الصورة داخل التعبير.
قد تظهر الرسالة هكذا:
File "main.py", line 3
result = x + * 2
^
SyntaxError: invalid syntax
السبب السادس: استخدام كلمة محجوزة كاسم متغير
لا يمكن استخدام كلمات بايثون المحجوزة مثل class وdef وfor وif كأسماء متغيرات، لأن لها معنى نحويًا خاصًا داخل اللغة.
الكود الخاطئ:
class = "Math"
الصحيح:
course = "Math"
إذا كانت رسالة الخطأ عند اسم متغير، تأكد أيضًا أن الاسم لا يبدأ برقم وأنه ليس كلمة محجوزة في بايثون.
السبب السابع: المشكلة قد تبدأ في السطر السابق
علامة ^ تشير إلى الموضع الذي اكتشفت عنده بايثون أن تركيب الكود غير صالح، لكنها لا تعني دائمًا أن الحرف الموجود فوقها هو السبب الحقيقي.
في Python الحديثة أصبحت كثير من الرسائل أدق، ومع ذلك تبقى قاعدة فحص السياق مهمة، خصوصًا إذا كان هناك قوس أو نص أو تركيب بدأ في سطر سابق.
print("Welcome"
name = "Ahmed"
المشكلة بدأت في سطر print لأن القوس لم يُغلق. في الإصدارات الحديثة قد تشير الرسالة مباشرة إلى القوس وتقول إنه لم يُغلق، لكن إذا بدا السطر الحالي صحيحًا فافحص ما قبله.
{alertInfo} افحص السطر السابق خصوصًا: الأقواس، علامات الاقتباس، النقطتين، الفواصل، وبنية الشرط أو الحلقة.
كيف تقرأ رسالة SyntaxError؟
لنستخدم مثالًا حقيقيًا يحتوي تركيبًا غير صالح:
x = 10
result = x + * 2
print(result)
رسالة الخطأ:
File "main.py", line 3
result = x + * 2
^
SyntaxError: invalid syntax
File "main.py": اسم الملف الذي يحتوي المشكلة.line 3: رقم السطر الذي اكتشفت عنده بايثون الخطأ.- السطر المعروض: الكود القريب من المشكلة.
- علامة
^: الموضع الذي فشل عنده تحليل التركيب. السبب قد يكون هناك أو قبله. SyntaxError: invalid syntax: نوع الخطأ والرسالة.
لفهم رقم السطر والـTraceback وبقية رسائل الأخطاء بطريقة أوسع، راجع أساسيات بايثون 32: شرح أخطاء بايثون وقراءة رسائل الخطأ.
هل تتبع شرحًا قديمًا مكتوبًا لـ Python 2؟
بعض الأكواد القديمة تستخدم صياغة لم تعد صحيحة في Python 3.
كود Python 2 قديم:
print "Hello"
في Python 3 تظهر SyntaxError أكثر تحديدًا وتقترح غالبًا إضافة الأقواس إلى print().
الصحيح في Python 3:
print("Hello")
هل كتبت pip install أو python file.py داخل >>>؟
أحيانًا لا تكون المشكلة في كود الملف أصلًا. إذا كنت داخل مفسر بايثون التفاعلي ويظهر أمامك >>>، ثم كتبت أمرًا مخصصًا للـTerminal مثل pip install requests أو python app.py، فقد تظهر SyntaxError: invalid syntax.
خطأ داخل مفسر بايثون:
>>> pip install requests
الصحيح: اكتب exit() للخروج من >>>، ثم نفّذ الأمر في Terminal أو CMD أو PowerShell:
python -m pip install requests
بعد التثبيت عد إلى ملف بايثون واكتب import requests. وإذا أردت فهم التثبيت والاستيراد والفرق بينهما، راجع شرح import في بايثون للمبتدئين.
جدول سريع لأسباب SyntaxError
| المشكلة | ما الذي تفحصه؟ |
|---|---|
SyntaxError بعد if أو for | هل نسيت :؟ |
| السطر يبدو صحيحًا | افحص السطر السابق أيضًا. |
| قوس مفتوح | تأكد أن كل قوس له إغلاق مناسب. |
شرط يحتوي = | إذا كنت تقارن، استخدم ==. |
| نص غير مغلق | راجع علامات الاقتباس. |
اسم متغير مثل class | تأكد أن الاسم ليس كلمة محجوزة ولا يبدأ برقم. |
pip install بعد >>> | اخرج من مفسر بايثون وشغّل الأمر في Terminal. |
| تعبير غير مفهوم | راجع ترتيب العوامل والفواصل وبنية السطر. |
Checklist: كيف تصلح SyntaxError خطوة بخطوة؟
- اقرأ رقم السطر.
- افحص السطر المشار إليه.
- افحص السطر السابق.
- راجع الأقواس.
- راجع علامات الاقتباس.
- راجع
:. - راجع
=و==. - تأكد أن اسم المتغير ليس كلمة محجوزة.
- إذا ظهر
>>>، لا تكتب داخله أوامر Terminal مثلpip install. - أصلح مشكلة واحدة ثم أعد تشغيل البرنامج.
يمكنك تجربة الأمثلة الخاطئة ثم تصحيحها بنفسك داخل محرر بايثون العرب.
مثال عملي كامل: كود خاطئ ثم تصحيحه
الكود الخاطئ:
name = "Ahmed"
if name == "Ahmed"
print("مرحبا أحمد"
يوجد خطآن: نسيان : بعد if، وعدم إغلاق قوس print().
الكود الصحيح:
name = "Ahmed"
if name == "Ahmed":
print("مرحبا أحمد")
الناتج: مرحبا أحمد.
هل SyntaxError هو نفسه IndentationError؟
لا. IndentationError له رسائل مستقلة في كثير من حالات المسافات البادئة، لذلك لا نتعامل معه هنا كأنه نفس خطأ invalid syntax.
إذا كانت المشكلة في Tab وSpace أو مستوى الإزاحة، راجع حل خطأ IndentationError في بايثون أو شرح المسافات البادئة Indentation في بايثون.
أخطاء قريبة قد يخلط بينها المبتدئ
NameError وTypeError وModuleNotFoundError ليست هي SyntaxError: invalid syntax. إذا كان الكود صحيح الصياغة ثم ظهرت مشكلة أثناء التشغيل، فأنت غالبًا أمام نوع آخر من الأخطاء.
إذا ظهرت رسالة NameError: name is not defined، راجع مشكلة وحل 9: حل خطأ NameError في بايثون. وللفرق بين أخطاء الصياغة والأخطاء التي تحدث أثناء التشغيل، راجع أساسيات بايثون 31: شرح try وexcept. تذكّر أن try/except لا تعالج كودًا لا يمكن لبايثون تحليله أصلًا؛ يجب إصلاح SyntaxError أولًا.
روابط مهمة من بايثون العرب
مصدر خارجي مفيد
أخطاء الصياغة والاستثناءات في توثيق بايثون الرسمي.
الخلاصة
خطأ SyntaxError: invalid syntax يعني أن بايثون لم تستطع فهم تركيب الكود. ابدأ بالسطر المشار إليه، ثم افحص السطر السابق، وراجع الأقواس والاقتباسات والنقطتين والعوامل مثل = و==.
وقد تعرض Python الحديثة رسائل SyntaxError أكثر تحديدًا مثل expected ':' أو unterminated string literal أو '(' was never closed. هذه الرسائل تساعدك على تحديد السبب بسرعة.
{alertSuccess} القاعدة الذهبية: إذا لم تجد المشكلة في السطر الذي تشير إليه الرسالة، افحص السطر الذي قبله قبل أن تغيّر أجزاء أخرى من البرنامج.
أسئلة شائعة
ماذا يعني SyntaxError: invalid syntax؟
يعني أن بايثون وجدت تركيبًا غير صالح في الكود ولم تستطع تفسيره حسب قواعد اللغة.
كيف أصلح invalid syntax في بايثون؟
ابدأ برقم السطر، وافحص السطر نفسه والسطر السابق، ثم راجع الأقواس والاقتباسات والنقطتين والعوامل المستخدمة داخل الشروط.
لماذا تشير علامة ^ إلى سطر أو موضع يبدو صحيحًا؟
لأنها تشير إلى الموضع الذي اكتشفت عنده بايثون أن التحليل لم يعد ممكنًا. قد يكون السبب الحقيقي قبل هذا الموضع.
هل يمكن أن يكون الخطأ في السطر السابق؟
نعم. قوس أو String أو تركيب غير مكتمل في السطر السابق قد يؤثر على كيفية تفسير السطر التالي.
ما الفرق بين = و == داخل شرط بايثون؟
= للإسناد، بينما == للمقارنة.
لماذا يظهر SyntaxError بعد if أو for؟
من الأسباب الشائعة نسيان : في نهاية السطر، وقد تعرض Python الحديثة رسالة أدق مثل expected ':'.
لماذا يظهر SyntaxError عند كتابة pip install؟
غالبًا لأنك كتبت أمر pip install داخل مفسر بايثون الذي يظهر فيه >>>. اخرج باستخدام exit() ثم نفّذ أمر التثبيت في Terminal أو CMD أو PowerShell.