سؤال

أنا متأكد من أن هذا موضوع يدور في أذهان معظم مطوري بايثون مع الأخذ في الاعتبار أن بايثون 3 سيصدر قريبًا.بعض الأسئلة التي تجعلنا نسير في الاتجاه الصحيح:

  1. هل سيكون لديك إصدار python 2 وpython 3 ليتم صيانته بشكل متزامن أم أنه سيكون لديك ببساطة إصدار python 3 بمجرد الانتهاء؟

    • هل بدأت بالفعل أو تخطط للبدء قريبًا؟أو هل تخطط للانتظار حتى صدور النسخة النهائية للوصول إلى مرحلة التشغيل الكامل؟
هل كانت مفيدة؟

المحلول

ها هي الخطة العامة لـ Twisted.كنت سأقوم بتدوين هذا في الأصل، ولكن بعد ذلك فكرت:لماذا أقوم بالتدوين حول هذا الموضوع عندما أتمكن من الحصول عليه نقاط لذلك؟

  1. انتظر حتى يهتم شخص ما.

    في الوقت الحالي، لا أحد لديه بايثون 3.لن نبذل الكثير من الجهد حتى يأتي مستخدم فعلي واحد على الأقل ويقول "أحتاج إلى دعم Python 3.0"، ولديه سبب وجيه لذلك بصرف النظر عن حقيقة أن الإصدار 3.0 يبدو لامعًا.

  2. انتظر حتى يتم ترحيل تبعياتنا.

    نظام كبير مثل Twisted لديه عدد من التبعيات.بالنسبة للمبتدئين، لدينا ما يلي:

    تحتوي بعض هذه المشاريع على مجموعة من التبعيات الخاصة بها، لذا سيتعين علينا انتظارها أيضًا.

  3. انتظر حتى يهتم شخص ما بما فيه الكفاية للمساعدة.

    هناك، بشكل خيري، 5 أشخاص يعملون في Twisted - وأنا أقول "بشكل خيري" لأن هذا يحسبني، ولم ألتزم منذ أشهر.لدينا أكثر من 1000 تذكرة مفتوحة في الوقت الحالي، وسيكون من الجيد إصلاح بعض هذه الأمور فعليًا - إصلاح الأخطاء، وإضافة ميزات، وجعل Twisted منتجًا أفضل في حد ذاته بشكل عام - قبل قضاء الوقت في نقله إلى إصدار جديد تمامًا من اللغة.

    من المحتمل أن يشمل هذا الرعاة رعاية كافية لدفع ثمن القيام بذلك، ولكن آمل أن يكون هناك تدفق للمتطوعين الذين يهتمون بدعم 3.0 ويريدون المساعدة في دفع المجتمع إلى الأمام.

  4. اتبع نصيحة جويدو.

    هذا يعنى لن نقوم بتغيير واجهة برمجة التطبيقات الخاصة بنا بشكل غير متوافق, ، وسنتابع المبادئ التوجيهية للتنمية الانتقالية التي نشرها جويدو العام الماضي.يبدأ ذلك بإجراء اختبارات الوحدة وتشغيلها أداة التحويل 2to3 عبر قاعدة التعليمات البرمجية الملتوية.

  5. قم بالإبلاغ عن الأخطاء الموجودة في أداة 2to3 وقم بتقديم تصحيحات لها.

    عندما نصل إلى النقطة التي نستخدمها فيها فعليًا، أتوقع أنه سيكون هناك الكثير من المشكلات أثناء التشغيل 2to3 فى المستقبل.يستغرق تشغيله على Twisted الآن وقتًا طويلاً للغاية ولا يمكن (آخر مرة قمت فيها بالتحقق، والذي كان منذ فترة طويلة) تحليل عدد قليل من الملفات الموجودة في مستودع Twisted، لذلك لن يتم استيراد الإخراج الناتج.أعتقد أنه يجب أن يكون هناك قدر لا بأس به من قصص النجاح من المشاريع الصغيرة والكثير من الطرق على الأداة قبل أن تنجح فعليًا بالنسبة لنا.

    ومع ذلك، فقد كان فريق تطوير Python مفيدًا للغاية في الاستجابة لتقارير الأخطاء لدينا، وكانت الاستجابات المبكرة لهذه المشكلات مشجعة، لذلك أتوقع أن يتم إصلاح جميع هذه المشكلات في الوقت المناسب.

  6. الحفاظ على التوافق 2.x لعدة سنوات.

    في الوقت الحالي، يدعم Twisted إصدار python 2.3 إلى 2.5.نعمل حاليًا على دعم الإصدار 2.6 (والذي من الواضح أنه سيتعين علينا الانتهاء منه قبل الإصدار 3.0!).تتمثل خطتنا في مراجعة إصداراتنا المدعومة من Python استنادًا إلى الإصدارات المدعومة طويلة المدى من أوبونتو - الإصدار 8.04، والذي يتضمن Python 2.5، سيتم دعمه حتى عام 2013.وفقًا لنصيحة Guido، سنحتاج إلى إسقاط دعم الإصدار 2.5 من أجل دعم الإصدار 3.0، ولكنني آمل أن نتمكن من إيجاد طريقة للتغلب على ذلك (نحن مبدعون جدًا في اختراقات توافق الإصدار).

    لذلك، نحن نخطط لدعم Python 2.5 حتى عام 2013 على الأقل.في غضون عامين، ستصدر Ubuntu إصدارًا آخر مدعومًا طويل المدى من Ubuntu:إذا كانوا لا يزالون موجودين، ويظلون في الموعد المحدد، فسيكون ذلك 10.04.أنا شخصياً أعتقد أن هذا سيتم شحنه مع Python 2.x، وربما python 2.8، كما /usr/bin/python, ، نظرًا لوجود عدد كبير من برامج Python المضمنة في التوزيع وسيستغرق تحديثها جميعًا وقتًا طويلاً.إذن، من خمس سنوات ثم, ، في عام 2015، يمكننا البدء في النظر في إسقاط دعم 2.x.

    خلال هذه الفترة، سنستمر في اتباع نصيحة جويدو بشأن الهجرة:تشغيل 2to3 على قاعدة التعليمات البرمجية 2.x الخاصة بنا، وتعديل قاعدة التعليمات البرمجية 2.x للحفاظ على نجاح اختباراتها في كلا الإصدارين.

    والنتيجة هي أن Python 3.x لن يكون مصدر لغة Twisted حتى بعد عيد ميلادي الخامس والثلاثين - سيكون وقت تشغيل مستهدفًا (ومجموعة من الإرشادات والقيود) لرمز python 2.x الخاص بي.أتوقع أن أكتب برامج بلغة Python 2.x للسنوات العشر القادمة أو نحو ذلك.

هذه هي الخطة.آمل أن ينتهي الأمر بمظهر محافظ بشكل مثير للضحك خلال عام أو نحو ذلك.أن الانتقال إلى الإصدار 3.x سهل للغاية، ويقوم الجميع بالترقية بسرعة.يمكن أن تحدث أشياء أخرى أيضًا:من الممكن أن يتقارب الفرعان 2.x و3.x، وقد ينتهي الأمر بشخص ما بكتابة ملف 3to2, ، أو وقت تشغيل آخر (يتبادر إلى ذهني PyPy) قد يسمح بتشغيل كود 2.x و3.x في نفس العملية مباشرة، مما يجعل عملية التحويل لدينا أسهل.

ومع ذلك، في الوقت الحالي، نفترض أنه لسنوات عديدة، سيكون لدينا أشخاص لديهم قواعد تعليمات برمجية كبيرة يحتفظون بها (أو أشخاص يكتبون تعليمات برمجية جديدة ويرغبون في استخدامها) آخر المكتبات التي لم يتم ترحيلها بعد) والذين ما زالوا يريدون ميزات جديدة وإصلاحات للأخطاء في Twisted.أتوقع قريبًا أن يكون لدينا أيضًا مستخدمون متطورون يرغبون في استخدام Twisted على python 3.أود أن أقدم لجميع هؤلاء الأشخاص تجربة إيجابية لأطول فترة ممكنة.

نصائح أخرى

يستخدم مشروع جانغو المكتبة six للحفاظ على قاعدة التعليمات البرمجية التي تعمل في وقت واحد على Python 2 و بايثون 3 (مشاركة مدونة).

six يقوم بذلك عن طريق توفير طبقة توافق تعمل على إعادة توجيه الواردات والوظائف بذكاء إلى مواقعها الخاصة (بالإضافة إلى توحيد التغييرات الأخرى غير المتوافقة).

مزايا واضحة:

  • لا حاجة إلى فروع منفصلة لـ Python 2 وPython 3
  • لا توجد أدوات تحويل، مثل 2to3.

الفكرة الرئيسية للإصدار 2.6 هي توفير مسار ترحيل إلى الإصدار 3.0.لذلك يمكنك استخدام from __future__ import X قم بترحيل ميزة واحدة ببطء في كل مرة حتى يتم تثبيتها جميعًا ويمكنك الانتقال إلى الإصدار 3.0.ستتدفق العديد من ميزات الإصدار 3.0 إلى الإصدار 2.6 أيضًا، لذا يمكنك تقليل الفجوة اللغوية تدريجيًا بدلاً من الاضطرار إلى ترحيل كل شيء دفعة واحدة.

في العمل، نخطط للترقية من 2.5 إلى 2.6 أولاً.ثم نبدأ في تمكين ميزات الإصدار 3.0 ببطء وحدة واحدة في كل مرة.في مرحلة ما، من المحتمل أن يكون الجزء الفرعي بالكامل من النظام جاهزًا للإصدار 3.x.

المشكلة الوحيدة هي المكتبات.إذا لم يتم ترحيل المكتبة مطلقًا، فسنظل عالقين في المكتبة القديمة.لكنني واثق تمامًا من أننا سنحصل على بديل جيد في الوقت المناسب لهذا الجزء.

التحدث كمؤلف مكتبة:

وأنا في انتظار صدور النسخة النهائية.اعتقادي، مثل اعتقاد معظم مجتمع بايثون، هو أن الإصدار 2.x سيظل هو الإصدار السائد لمدة أسابيع أو أشهر.هذا وقت كافٍ لإصدار إصدار 3.x جميل ومصقول.

سأحتفظ بفرعين منفصلين 2.x و3.x.سيكون الإصدار 2.x متوافقًا مع الإصدار 2.4، لذا لا يمكنني استخدام الكثير من التركيبات اللغوية الرائعة أو الميزات الجديدة في الإصدار 2.6/3.0.في المقابل، سيستخدم الفرع 3.x كل واحدة من تلك الميزات التي تؤدي إلى تجربة أفضل للمستخدم.سيتم تعديل مجموعة الاختبار بحيث يعمل عليها 2to3، وسأحتفظ بنفس الاختبارات لكلا الفرعين.

دعم كليهما

كنت أرغب في محاولة تحويل مكتبة BeautifulSoup إلى 3x لمشروع أعمل عليه ولكن يمكنني أن أرى كيف سيكون من الصعب الحفاظ على فرعين مختلفين من الكود.

النموذج الحالي للتعامل مع هذا يشمل:

  1. إجراء تغيير على فرع 2x
  2. تشغيل 2to3
  3. نصلي من أجل أن يتم التحويل بشكل صحيح في المرة الأولى
  4. قم بتشغيل الكود
  5. قم بإجراء اختبارات الوحدة للتحقق من أن كل شيء يعمل
  6. انسخ الإخراج إلى فرع 3x

يعمل هذا النموذج ولكن IMHO تمتص.لكل تغيير/إصدار عليك اتباع هذه الخطوات ::sigh::.بالإضافة إلى ذلك، فهو لا يشجع المطورين على توسيع الفرع 3x بميزات جديدة لا يمكن دعمها إلا في py3k لأنك لا تزال تستهدف بشكل أساسي جميع التعليمات البرمجية إلى 2x.

الحل...استخدام المعالج المسبق

نظرًا لأنني لم أتمكن من العثور على معالج مسبق لائق على النمط c مع توجيهات #define و #ifdef لـ python، فقد كتبت واحدًا.

تسمى pypreprocessor ويمكن العثور عليه في PYPI

في الأساس، ما تفعله هو:

  1. استيراد pypreprocessor
  2. اكتشاف إصدار بايثون الذي يعمل فيه البرنامج النصي
  3. قم بتعيين "تعريف" في المعالج المسبق للإصدار (على سبيل المثال "python2" أو "python3")
  4. رش التوجيهات "#ifdef python2" و"#ifdef python3" حيث يكون الرمز خاصًا بالإصدار
  5. قم بتشغيل الكود

هذا كل شيء.الآن ستعمل في كل من 2x و 3x.إذا كنت قلقًا بشأن الأداء الإضافي الناتج عن تشغيل معالج مسبق، فهناك أيضًا وضع يقوم بإزالة جميع البيانات التعريفية وإخراج المصدر بعد المعالجة إلى ملف.

أفضل من كل شيء...ما عليك سوى إجراء التحويل 2to3 مرة واحدة.

وإليك مثال العمل:

#!/usr/bin/env python
# py2and3.py

import sys
from pypreprocessor import pypreprocessor

#exclude
if sys.version[:3].split('.')[0] == '2':
    pypreprocessor.defines.append('python2')
if sys.version[:3].split('.')[0] == '3':
    pypreprocessor.defines.append('python3')

pypreprocessor.parse()
#endexclude
#ifdef python2
print('You are using Python 2x')
#ifdef python3
print('You are using python 3x')
#else
print('Python version not supported')
#endif

وهذه هي النتائج في المحطة:

 python py2and3.py
 >>>You are using Python 2x 
 python3 py2and3.py
 >>>You are using python 3x

إذا كنت تريد الإخراج إلى ملف وإنشاء ملف مصدر نظيف خاص بالإصدار بدون بيانات تعريف إضافية، أضف هذين السطرين في مكان ما قبل عبارة pypreprocessor.parse() :

pypreprocessor.output = outputFileName.py
pypreprocessor.removeMeta = True

ثم:

python py2and3.py

سيتم إنشاء ملف يسمى OutputFileName.py وهو خاص بـ python 2x ولا يحتوي على بيانات تعريف إضافية.

python3 py2and3.py

سيتم إنشاء ملف يسمى OutputFileName.py وهو خاص بـ python 3x ولا يحتوي على بيانات تعريف إضافية.

للحصول على التوثيق والمزيد من الأمثلة، راجع السحب pypreprocessor على GoogleCode.

امل بصدق ان يساعد هذا.أحب كتابة التعليمات البرمجية بلغة بايثون وآمل أن أرى تقدمًا في الدعم في مجال 3x في أسرع وقت ممكن.أنا أكره أن أرى اللغة لا تتقدم.خاصة وأن الإصدار 3x يحل الكثير من ملفات WTFs المميزة ويجعل بناء الجملة يبدو أكثر ملاءمة للمستخدمين الذين يهاجرون من لغات أخرى.

الوثائق في هذه المرحلة كاملة ولكنها ليست واسعة النطاق.سأحاول تزويد الويكي ببعض المعلومات الأكثر شمولاً قريبًا.

تحديث:

على الرغم من أنني صممت pypreprocessor خصيصًا لحل هذه المشكلة، إلا أنه لا يعمل لأن المعجم يقوم بالتحقق من بناء الجملة على كل التعليمات البرمجية قبل تنفيذ أي تعليمات برمجية.

إذا كان لدى python دعم توجيهي حقيقي للمعالج المسبق لـ C، فسيسمح للمطورين بكتابة كود python2x وpython3k جنبًا إلى جنب في نفس الملف ولكن نظرًا للسمعة السيئة للمعالج المسبق C (إساءة استخدام استبدال الماكرو لتغيير الكلمات الرئيسية للغة) لا أفعل ذلك شاهد إضافة الدعم الشرعي للمعالج المسبق لـ C إلى python في أي وقت قريب.

كانت مجموعة أدوات Zope في تقدم بطيء لدعم Python 3.بطيء بشكل رئيسي لأن العديد من هذه المكتبات معقدة للغاية.

بالنسبة لمعظم المكتبات أستخدم 2to3.تستغني بعض المكتبات عن ذلك لأنها بسيطة أو تحتوي على معظم التعليمات البرمجية في امتداد C.zc.buildout، وهي حزمة ذات صلة، ستقوم بتشغيل نفس الكود بدون 2to3 لدعم Python 2 و3.

نقوم بنقل ZTK إلى Python 3 لأن العديد من المكتبات والأطر الأخرى تعتمد عليه، مثل Twisted وPyramid Framework.

ستبقى بعض أكواد 2.x الأكثر تعقيدًا عند 2.5 أو 2.6.سأنتقل إلى الإصدار 3.0 لجميع التطويرات الجديدة بمجرد تحديث بعض مكتبات الطرف الثالث التي أستخدمها غالبًا للإصدار 3.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top