كما نعلم أن لغة البرمجة مثل بايثون هي لغة مفسرة، مما يعني بشكل أساسي أن كل كتلة أو سطر من التعليمات البرمجية تتم معالجته واحدًا تلو الآخر، بدلاً من تغيير البرنامج بأكمله إلى كود منخفض المستوى تمامًا.
عندما يقوم مترجم بايثون بمسح سطر من التعليمات البرمجية ويلاحظ شيئًا غير استثنائي، فإنه يظهر خطأ يُعرف باسم خطأ Syntax Error. بشكل عام، القوس المفقود، والاقتباس النهائي المفقود، وغيرها من الحالات الشاذة الأساسية في بناء الجملة هي سبب ظهور الأخطاء.
في البرنامج التعليمي التالي، سنكتشف أحد الأخطاء النحوية في بايثون المعروف باسم EOL، والذي يظهر عادةً عندما نحاول فحص سلسلة حرفية.
فهم معنى EOL
يجب علينا أن نفهم معنى موسوعة الحياة بشكل فعال قبل حل المشكلة. EOL هو اختصار لعبارة 'نهاية السطر'. يشير خطأ EOL إلى أن مترجم Python وصل إلى نهاية السطر أثناء مسح السلسلة الحرفية.
يجب أن تكون السلسلة الحرفية، المعروفة أيضًا باسم الثوابت، محاطة بعلامات اقتباس مفردة أو مزدوجة. الوصول إلى 'نهاية السطر' عندما نحاول المسح يعني أننا وصلنا إلى الحرف الأخير من السلسلة ولم نواجه علامات الاقتباس النهائية.
دعونا نفكر في مثال أساسي يوضح كيفية ظهور خطأ موسوعة الحياة.
مثال:
# defining a string value my_string = 'This is my string literal, and it is broken... # printing the string value print('String:', my_string)
انتاج:
File 'D:Python ernarypy.py', line 2 my_string = 'This is my string literal, and it is broken... ^ SyntaxError: EOL while scanning string literal
توضيح:
في مقتطف التعليمات البرمجية أعلاه، قمنا بتعريف سلسلة حرفية؛ ومع ذلك، فقد فقدنا علامة الاقتباس في نهاية السلسلة، مما أدى إلى ظهور علامة الاقتباس خطأ في بناء الجملة يسمى EOL أثناء طباعة تلك السلسلة للمستخدمين.
في قسم الإخراج، يمكننا ملاحظة سهم صغير يشير إلى الحرف الأخير من السلسلة، مما يدل على أن الخطأ قد حدث عندما حاول البرنامج تحليل هذا الجزء من العبارة.
الآن بعد أن فهمنا المشكلة، دعونا نفهم بعض الحالات التي يمكن أن يظهر فيها هذا الخطأ أثناء تنفيذ كود بايثون.
إصلاح 'خطأ في بناء الجملة: EOL أثناء فحص السلسلة الحرفية.'
من الممكن أن نواجه هذا الخطأ في أربع حالات رئيسية أثناء العمل على برنامج بايثون. هذه الحالات الأربعة الرئيسية هي كما هو موضح أدناه:
- علامة الاقتباس النهائية مفقودة
- استخدام علامة الاقتباس النهائية غير الصحيحة
- سلسلة مستمرة تمتد إلى أسطر متعددة
- استخدام الشرطة المائلة العكسية قبل علامة الاقتباس النهائية
دعونا نبدأ في فهم كل من هذه المواقف ونحاول التغلب عليها.
علامة الاقتباس النهائية مفقودة
كما تمت مناقشته في مقتطف التعليمات البرمجية السابق، فإن مترجم بايثون يثير خطأ في بناء الجملة عندما يصل إلى نهاية السلسلة الحرفية ويكتشف أن علامة الاقتباس مفقودة.
مثال:
# defining a string value my_string = 'This is my string literal, and it is broken... # printing the string value print('String:', my_string)
توضيح:
يمكننا أن نلاحظ أن علامة الاقتباس في نهاية السلسلة الحرفية مفقودة، وهو ما يبرر الخطأ النحوي أيضًا. تحتوي كل لغة على عدد قليل من القواعد الأساسية المتعلقة ببناء الجملة، والتي تؤدي إلى حدوث أخطاء عند انتهاكها.
دعونا الآن نفكر في بناء الجملة التالي كحل للمشكلة المذكورة أعلاه.
حل:
# defining a string value my_string = 'This is my string literal, and it is broken...' # printing the string value print('String:', my_string)
انتاج:
String: This is my string literal, and it is broken...
توضيح:
في مقتطف التعليمات البرمجية أعلاه، يمكننا أن نلاحظ أننا قمنا بتضمين علامة الاقتباس في نهاية السلسلة الحرفية. ونتيجة لذلك، تتم طباعة السلسلة للمستخدمين بنجاح دون ظهور أي خطأ في بناء الجملة.
استخدام علامة الاقتباس النهائية غير الصحيحة
يمكننا الاستفادة من '' إلى جانب '' من أجل إحاطة ثابت سلسلة معين في بايثون. ومع ذلك، غالبًا ما يستخدم المبرمج علامة اقتباس غير صحيحة في نهاية قيمة السلسلة. يؤدي مثل هذا الموقف إلى ظهور خطأ في بناء الجملة فيما يتعلق بموسوعة الحياة.
دعونا نفكر في مثل هذا الموقف في المثال التالي:
مثال:
# defining a string value my_string = 'This is my string literal with wrong quotation mark at the end.' # printing the string value print('String:', my_string)
انتاج:
File 'D:Python ernarypy.py', line 2 my_string = 'This is my string literal with wrong quotation mark at the end.' ^ SyntaxError: EOL while scanning string literal
توضيح:
في مقتطف التعليمات البرمجية أعلاه، استخدمنا علامة الاقتباس غير الصحيحة في نهاية قيمة السلسلة التي تؤدي إلى خطأ في بناء الجملة.
يمكننا تجنب مثل هذه المشكلة عن طريق استخدام علامة الاقتباس المطابقة في نهاية السلسلة، كما هو موضح في مقتطف التعليمات البرمجية التالي.
حل:
# defining a string value my_string = 'This is my string literal with wrong quotation mark at the end.' # printing the string value print('String:', my_string)
انتاج:
String: This is my string literal with wrong quotation mark at the end.
توضيح:
في مقتطف التعليمات البرمجية أعلاه، كما يمكننا أن نلاحظ، استخدمنا علامة الاقتباس المطابقة في نهاية السلسلة التي تساعدنا على تجنب أي خطأ في EOL.
سلسلة مستمرة تمتد إلى أسطر متعددة
هناك العديد من مبرمجي بايثون المبتدئين الذين يرتكبون خطأ تمديد البيانات إلى أكثر من سطر واحد. تأخذ بايثون بعين الاعتبار سطرًا جديدًا باعتباره نهاية العبارة، على عكس اللغات الأخرى مثل C++ وJava التي تأخذ هذا الاعتبار ';' كنهاية البيانات.
دعونا نفكر في مثال يوضح نفس المشكلة.
مثال المشكلة:
# defining a string value my_string = 'This is my string literal... this is my new line' # printing the string value print('String:', my_string)
انتاج:
File 'D:Python ernarypy.py', line 2 my_string = 'This is my string literal... ^ SyntaxError: EOL while scanning string literal
توضيح:
ما هو حجم هذه الشاشة
في مقتطف الكود أعلاه، يمكننا ملاحظة أن الكود قد يبدو عاديًا؛ ومع ذلك، بمجرد بدء السطر التالي، يضع مترجم بايثون حدًا لهذه العبارة مما يؤدي إلى حدوث خطأ في بناء الجملة لعدم تضمين ثابت السلسلة.
ومع ذلك، يمكننا حل هذه المشكلة باستخدام طرق مختلفة كما هو موضح أدناه:
الحل 1: استخدام ' ' لتوفير تأثير سطر جديد على ثابت السلسلة
# defining a string value my_string = 'This is my string literal... this is my new line' # printing the string value print('String:', my_string)
انتاج:
String: This is my string literal... this is my new line
توضيح:
في مقتطف التعليمات البرمجية أعلاه، قمنا بتضمين 'ن' في ثابت السلسلة لتوفير تأثير سطر جديد لها. ونتيجة لذلك، يقسم ثابت السلسلة العبارة إلى أسطر متعددة.
الآن دعونا نفكر في حل آخر.
الحل 2: استخدام علامات الاقتباس الثلاثية ''' أو ''' لتخزين ثوابت سلسلة متعددة الأسطر
# defining a string value my_string = '''This is my string literal... this is my new line''' # printing the string value print('String:', my_string)
انتاج:
String: This is my string literal... this is my new line
توضيح:
في مقتطف الكود أعلاه، استخدمنا علامة الاقتباس الثلاثية، ''' من أجل تخزين ثوابت سلسلة متعددة الأسطر.
استخدام الشرطة المائلة العكسية قبل علامة الاقتباس النهائية
الخط المائل العكسي '' هو المسؤول عن الهروب من السلسلة ويسبب خطأ في بناء الجملة.
دعونا نتأمل المثال التالي.
مثال:
# storing a directory path my_string = 'D:PythonMy_Folder' # printing the string value print('String:', my_string)
انتاج:
File 'D:Python ernarypy.py', line 2 my_string = 'D:PythonMy_Folder' ^ SyntaxError: EOL while scanning string literal
توضيح:
في مقتطف التعليمات البرمجية أعلاه، استخدمنا شرطة مائلة عكسية '' من أجل فصل مسارات المجلد عن بعضها البعض. ومع ذلك، أثناء تنفيذ البرنامج، أثار مترجم بايثون خطأً في بناء الجملة.
الشرطة المائلة العكسية الأخيرة قبل أن تفلت علامة الاقتباس من ثابت السلسلة، ويأخذها في الاعتبار مترجم بايثون ' كحرف واحد. يترجم تسلسل الهروب هذا إلى علامة اقتباس (') .
يمكننا حل هذه المشكلة باستخدام مقتطف التعليمات البرمجية التالي.
حل:
# storing a directory path my_string = 'D:\Python\My_Folder\' # printing the string value print('String:', my_string)
انتاج:
String: D:PythonMy_Folder
توضيح:
في مقتطف التعليمات البرمجية أعلاه، استخدمنا '\' في ثابت السلسلة ونتيجة لذلك، يقوم مترجم بايثون بتنفيذ تلك السلسلة دون ظهور خطأ.