بايثون / دليل حلول تحريري

تشخيص SyntaxError وIndentationError بأمان

استخدم الموضع المبلغ عنه دليلا، وافحص البنية المحيطة، وتحقق من الصياغة المصححة دون تشغيل البرنامج.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى

قاعدة معرفة للقراءة فقط · بلا تعليقات عامة

تعرّف على الأعراض

يرفض المفسر بدء الملف ويعرض SyntaxError أو IndentationError أو TabError. قد يشير السهم إلى سطر يبدو سليما لأن قوسا أو نصا أو كتلة سابقة غير مكتملة.

قد يتضمن المثال المنسوخ رموز >>> أو مسافات غيرها المحرر. احفظ الخطأ والمصدر المحيط بدلا من تعديل المحرف المشار إليه مرارا.

افهم الأسباب المحتملة

  • تشمل الأسباب غياب النقطتين بعد رأس تعليمة مركبة أو عدم إغلاق الأقواس والنصوص أو اصطفاف الكتلة خطأ أو مزج الجدولة والمسافات. يحدد الموضع مكان استحالة التحليل وقد يأتي بعد الخطأ الأصلي.
  • قد تفشل صياغة إصدار أحدث على مفسر أقدم. تحقق من الإصدار الفعلي قبل تغيير مثال صحيح ليلائم بيئة غير مقصودة.

1. اقرأ التشخيص كاملا

سجل الملف ورقم السطر والسهم والرسالة الدقيقة. افحص السطر وما يسبقه في النسخة المحفوظة، وتأكد أنه المسار الذي شُغل. راجع أزواج الأقواس بأنواعها والنصوص غير المغلقة. لا يستطيع المحلل دائما معرفة قصد الكاتب من المدخل الناقص. أصلح أول مشكلة بنيوية تملك دليلا عليها ثم أعد التحليل؛ فقد تكون الرسائل التالية نتائج للخلل نفسه.

2. أعد بناء الكتلة المقصودة

ينتهي رأس if أو for أو while أو def أو class بنقطتين وتتبعه كتلة ذات مسافة بادئة. استخدم أربع مسافات لكل مستوى باتساق. حاذ elif وelse مع if التابعة لها، وexcept وfinally مع try. أظهر المحارف البيضاء عند الشك في الجدولة. لا تحذف البادئات عشوائيا؛ قد تقبل الصياغة ويتغير انتماء التعليمات للفروع. المقطع الخاطئ أدناه غير قابل للتشغيل عمدا، ويحفظ الإصلاح جسم حلقة من تعليمتين.

python توضيح خاطئ: غياب النقطتين وبادئة الكتلة
for number in range(2)
print(number)

مصدر غير صالح عمدا للفحص فقط، وليس مثالا كاملا للتشغيل.

python حلقة كاملة مصححة
for number in range(2):
    doubled = number * 2
    print(doubled)
الناتج المتوقع
0
2

تفتح النقطتان الكتلة وتشترك التعليمتان في بادئتها. توضح النتيجة انتماءهما إلى الحلقة.

3. افحص الصياغة دون تنفيذ

تستطيع compile تحليل نص مصدر معروف وترجمته دون تنفيذ كائن الشفرة الناتج. لا تمرره إلى exec أو eval أثناء تشخيص الصياغة. يترجم المثال نصا صغيرا ثابتا في الذاكرة ويطبع علامة نجاح. عند فحص ملف حقيقي اقرأ المقصود وحده واحترم تصريح ترميز المصدر باستخدام أداة واعية به. يثبت النجاح قبول الصياغة لهذا المفسر، لا صحة النتائج أو أمان السلوك أو نجاح الاستيراد.

python ترجمة مقطع ثابت دون تنفيذه
source = "if True:\n    answer = 42\n"
compile(source, "<syntax-check>", "exec")
print("Syntax accepted")
الناتج المتوقع
Syntax accepted

تحدد exec هنا نمط صياغة التعليمات، ولا تنفذ الكائن المعاد. لا يشغل المثال كائن الشفرة.

4. راجع المعنى بعد قبول الصياغة

تتبع حالة صغيرة متوقعة بعد مراجعة الكتلة المصححة. لا تنفذ إلا مصدرا تفهمه ومأذونا لك في سياق محلي معزول. اختبر جانبي الفرع وحالة الحلقة الفارغة عند الحاجة. قد تكون print صحيحة نحويا لكنها تعمل مرة بعد الحلقة بدلا من كل عنصر. إذا استمر الفشل صغر المثال مع حفظ أول خلل وتحقق من دعم المفسر للصياغة.

تحقق من نجاح الإصلاح

تترجم النسخة المحفوظة بالمفسر المدعوم المقصود دون رسائل صياغة أو بادئات، ويتوافق الاصطفاف مع شجرة التحكم المقصودة.

ينتج فحص سلوكي صغير مأذون الأسطر المتوقعة في المسارات المعنية. لا تكفي الترجمة لإثبات حفظ المعنى بعد إصلاح البادئة.

امنع تكرار المشكلة

  • فعّل المسافات المتسقة ومطابقة الأقواس وإظهار البياض عند التشخيص. افصل المصدر عن رموز المحث، والتزم بإصدار المشروع المعلن.
  • أصلح بنية واحدة كل مرة وأعد فحص الصياغة قبل تغيير منطق غير مرتبط.

المراجع الرسمية