3.6% من مستودعات بايثون التي تم اختبارها كانت تفتقد إلى أخطاء الفاصلة

تم نشر نتائج دراسة حول مدى تعرض كود بايثون للأخطاء المتعلقة بالاستخدام الخاطئ للفواصل في الكود. ترجع المشكلة إلى حقيقة أنه عند التعداد، تقوم لغة Python تلقائيًا بتسلسل السلاسل الموجودة في القائمة إذا لم تكن مفصولة بفاصلة، كما تعامل القيمة على أنها صف إذا كانت القيمة متبوعة بفاصلة. بعد إجراء تحليل آلي لـ 666 مستودعًا على GitHub باستخدام كود Python، حدد الباحثون مشكلات محتملة في الفاصلة في 5% من المشاريع التي تمت دراستها.

أظهر الفحص اليدوي الإضافي وجود أخطاء حقيقية في 24 مستودعًا فقط (3.6%)، وكانت نسبة 1.4% المتبقية عبارة عن نتائج إيجابية كاذبة (على سبيل المثال، يمكن حذف الفاصلة عمدًا بين السطور لتسلسل مسارات الملفات متعددة الأسطر، والتجزئة الطويلة، وHTML) كتل أو تعبيرات SQL). من الجدير بالذكر أنه من بين المستودعات الـ 24 التي بها أخطاء حقيقية كانت هناك مشاريع كبيرة مثل Tensorflow وGoogle V8 وSentry وPydata xarray وRapidpro وDjango-colorfield وDjango-helpdesk. ومع ذلك، فإن مشاكل الفواصل ليست خاصة بـ Python وغالبًا ما تظهر في مشاريع C/C++ (من أمثلة الإصلاحات الحديثة LLVM وMono وTensorflow).

أهم أنواع الأخطاء التي تمت دراستها:

  • فقدان فاصلة عن طريق الخطأ في القوائم والصفوف والمجموعات، مما يتسبب في تسلسل السلاسل بدلاً من تفسيرها كقيم منفصلة. على سبيل المثال، في Sentry، أخطأ أحد الاختبارات وجود فاصلة بين السلاسل "releases" و"discover" في القائمة، مما أدى إلى التحقق من معالج "/releasesdiscover" غير الموجود، بدلاً من التحقق من "/releases" و" / اكتشف" بشكل منفصل.
    3.6% من مستودعات بايثون التي تم اختبارها كانت تفتقد إلى أخطاء الفاصلة

    مثال آخر هو أن الفاصلة المفقودة في Rapidpro تسببت في دمج قاعدتين مختلفتين في السطر 572:

    3.6% من مستودعات بايثون التي تم اختبارها كانت تفتقد إلى أخطاء الفاصلة

  • فاصلة مفقودة في نهاية تعريف الصف المكون من عنصر واحد، مما يتسبب في تعيين نوع عادي بدلاً من الصف. على سبيل المثال، سيؤدي التعبير "القيم = (1،)" إلى إسناد لمتغير صف من عنصر واحد، ولكن "القيم = (1)" سيؤدي إلى إسناد نوع صحيح. لا تؤثر الأقواس في هذه المهام على تعريف النوع وهي اختيارية، ويتم تحديد وجود الصف بواسطة المحلل اللغوي فقط بناءً على وجود الفواصل. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # سيتم تعيين سلسلة بدلاً من صف. ) }
  • الوضع المعاكس هو الفواصل الإضافية أثناء المهمة. إذا تم ترك فاصلة عن طريق الخطأ في نهاية المهمة، فسيتم تعيين صف كقيمة بدلاً من النوع العادي (على سبيل المثال، إذا تم تحديد "القيمة = 1" بدلاً من "القيمة = 1").

المصدر: opennet.ru

إضافة تعليق