मुझे लगा कि मैं Wim के उत्तर की वकालत की गई रणनीति में थोड़ा सा जोड़ दूंगा - 2.7 और 3.x दोनों पर काम कर रहे Django के उपयुक्त संस्करण को प्राप्त करें - और मेरे लिए काम करने वाली कुछ युक्तियों को रेखांकित करें।
पाइथन 2.7 आपकी एस्केप पॉड है, जब तक आप 3.x पर ट्रिगर खींचते हैं
- आपके परीक्षण दोनों पर चलने चाहिए
- किसी भी 3.x विशिष्ट सुविधाओं का उपयोग न करें, जैसे कि एफ-स्ट्रिंग्स
- पहले पायथन 3.x, फिर बाद में केवल Django 2.x जो 2.7 पर नहीं चलता है
- जल्दी शुरू करें, विश्लेषण न करें, लेकिन बड़े धमाके के दृष्टिकोण से बचें
- पहली बार में फ़ाइल द्वारा फ़ाइल।
- उपयोगिता पुस्तकालयों की तरह सबसे निचले स्तर के कोड के साथ शुरू करें, जिसके लिए आपके पास परीक्षण सूट हैं।
- यदि संभव हो तो, अपने बदलावों को धीरे-धीरे 2.7 उत्पादन शाखाओं में विलय करने का प्रयास करें और अपने 3.x पोर्टिंग कोड को ठेस परिवर्तनों के साथ अद्यतित रखें।
Django के किस मामूली संस्करण के साथ शुरू करने के लिए?
यहां मेरा मानदंड यह है कि Django माइग्रेशन में काफी शामिल हो सकता है (और वास्तव में 2 => 3 काम की तुलना में अधिक सोच की आवश्यकता होती है)। इसलिए मैं इस तरह से नवीनतम और सबसे बड़ा 1.11 पर जाऊंगा कि आप पहले से ही अपने 2.7 उपयोगकर्ताओं को कुछ मूल्य प्रदान कर रहे हैं। प्री-2.x संगतता की अच्छी संख्या शायद 1.11 पर है और आपको इसकी 2.x डेप्रिसिएशन चेतावनी मिल रही है।
पायथन 3.x के किस लघु संस्करण को शुरू करना है?
सभी कोणों पर विचार करने के लिए सबसे अच्छा, जैसे कि आपकी 3 पार्टी की लिबास की उपलब्धता, आपके सीआई / डेपॉप्स सुइट से समर्थन और आपके चुने हुए सर्वर ओएस छवियों पर उपलब्धता। आप हमेशा 3.8 स्थापित कर सकते हैं और उदाहरण के लिए, अपनी आवश्यकताओं के पाइप को स्थापित कर सकते हैं।
उत्तोलन गिट (या जो भी scm आप उपयोग करते हैं) और virtualenv ।
- अलग
requirement.txt
फाइलें, लेकिन ...
- यदि आपके पास एक फ़ाइल-आधारित, गिट रेपो है, तो आप एक ही कोडलाइन पर प्रत्येक वेनव को एक के साथ इंगित कर सकते हैं
pip install -e <your directory>
। इसका मतलब है कि, 2 अलग-अलग टर्मिनलों में आप 2.7 और 3.x को एक ही unittest (s) के खिलाफ चला सकते हैं।
- आप 2.7 और 3.x Django सर्वर भी अलग-अलग पोर्ट पर साइड-बाय-साइड चला सकते हैं और पॉइंट फ़ायरफ़ॉक्स और क्रोम को उन पर कह सकते हैं।
- अक्सर (पोर्टिंग शाखा पर कम से कम) और जीआईटी बिसेक्ट के बारे में जानें ।
2to3 का उपयोग करें
यदि आप इसे करते हैं तो हाँ, यह 2.7 कोड और Django को तोड़ देगा। इसलिए...
इसे पूर्वावलोकन मोड में या किसी एकल फ़ाइल के विरुद्ध चलाएं। देखें कि यह क्या टूटता है लेकिन यह भी देखें कि इसने क्या किया।
इसे केवल कुछ रूपांतरणों पर थ्रॉटल करें जो 2.7 या Django को नहीं तोड़ते हैं। print x
=> print (x)
और except(Exception) as e
2 बिना दिमाग वाले हैं।
यह मेरा गला घोंटा हुआ कमान जैसा दिखता था:
2to3 $tgt -w -f except -f raise -f next -f funcattrs -f print
- जब तक आप वास्तव में आश्वस्त नहीं हैं तब तक इसे फ़ाइल-दर-फ़ाइल चलाएं।
बल्क रूपांतरणों के लिए अपने संपादक के बजाय sed या awk का उपयोग करें ।
लाभ यह है कि, जैसा कि आप अपने ऐप्स की विशिष्ट चिंताओं के बारे में अधिक जागरूक हो जाते हैं, आप उन परिवर्तनों का एक सूट बना सकते हैं जो 1 फ़ाइल या कई फ़ाइलों पर चलाए जा सकते हैं और 2.7 या Django को तोड़े बिना अधिकांश काम करते हैं। अपने उपयुक्त-थ्रोटल 2to3 पास के बाद इसे लागू करें । यह आपको अपने संपादक में अवशिष्ट क्लीनअप के साथ छोड़ देता है और आपके परीक्षणों को पास करने के लिए मिलता है।
(वैकल्पिक) 2.7 कोड पर काला चलना शुरू करते हैं ।
ब्लैक जो एक कोड फॉर्मेटर है, अपने विश्लेषण को चलाने के लिए पायथन 3 एएसटी का उपयोग करता है। यह कोड को चलाने का प्रयास नहीं करता है, लेकिन यह सिंटैक्स त्रुटियों को चिह्नित करेगा जो इसे एएसटी चरण में जाने से रोकता है। हालांकि वहां पहुंचने के लिए आपको कुछ पाइप स्थापित करने के लिए वैश्विक जादू को काम करना होगा और आपको काले रंग की उपयोगिता में खरीदना होगा।
अन्य लोगों ने किया है - उनसे सीखें।
पायथन 3 में जाने के लिए # 155 व्यावहारिक चरणों को सुनकर आपको काम के कुछ विचार देने चाहिए। इसके लिए शो लिंक देखें। वे इंस्टाग्राम (?) कदम पर बात करना पसंद करते हैं, जिसमें एक सामान्य कोडबेस पर 2.7 कोड से 3.x सिंटैक्स तक चलने का क्रमिक समायोजन शामिल था, और एक ही गिट शाखा पर, जब तक ट्रिगर-डे-ट्रिगर नहीं होता।
कंजर्वेटिव पायथन 3 पोर्टिंग गाइड भी देखें
और इंस्टाग्राम ने पायथन 3 - द न्यू स्टैक के लिए एक स्मूथ मूव बनाया
निष्कर्ष
Django 1.11 EOL (अप्रैल 2020) के लिए आपका समय कम है, इसलिए यदि आपके पास इसे फेंकने के लिए 2+ देव संसाधन हैं, तो मैं निम्नलिखित पर विचार करूंगा:
DEV # 1: एक Django 1.11 बम्प पर शुरू होता है (सिद्धांत है कि Django 1.11 शायद सबसे अच्छी तरह से Django 2.x के लिए एक जंप बंद बिंदु के रूप में तैनात है), 2.7 का उपयोग कर।
DEV # 2: अपने गैर-Django उपयोगिता कोड के पायथन 3.6 / 3.7 पर आरंभ करें। चूंकि इस बिंदु पर कोड 2.7 संगत है, इसलिए इसे # 1 में मर्ज कर दें।
देखें कि दोनों कार्य कैसे आगे बढ़ते हैं, आकलन करें कि Django संबंधित परियोजना जोखिम क्या है और पायथन 3 दर्द कैसा दिखता है। आप पहले से ही पायथन 2.7 ईओएल को याद कर रहे हैं, लेकिन एक अप्रचलित वेब रूपरेखा शायद विरासत पायथन 2.7 से अधिक खतरनाक है, कम से कम कुछ महीनों के लिए। इसलिए मैं Django 1.9 से पलायन शुरू करने के लिए बहुत लंबा इंतजार नहीं करूंगा और ऐसा करने से आपका काम बर्बाद नहीं होगा। जैसे-जैसे आप प्रगति देखेंगे, आपको परियोजना के जोखिम बेहतर दिखने लगेंगे।
आपकी प्रारंभिक 2to3 प्रगति धीमी होगी, लेकिन टूलींग और मार्गदर्शन काफी अच्छा है कि आप जल्दी से गति प्राप्त करेंगे ताकि अनुभव इकट्ठा करना शुरू करने से पहले इसे खत्म न करें। Django पक्ष रूपरेखा में परिवर्तन को तोड़ने के लिए आपके संपर्क पर निर्भर करता है, यही कारण है कि मुझे लगता है कि जल्दी शुरू करना सबसे अच्छा है।
PS (विवादास्पद / व्यक्तिगत राय) मैंने छह या अन्य डिब्बाबंद 2-से-3 ब्रिज पुस्तकालयों का ज्यादा इस्तेमाल नहीं किया।
ऐसा इसलिए नहीं है क्योंकि मुझे इस पर भरोसा नहीं है - यह 3 पार्टी के कामों के लिए शानदार है - बल्कि यह है कि मैं एक जटिल स्थायी निर्भरता नहीं जोड़ना चाहता था (और मैं इसका डॉक्स पढ़ने के लिए बहुत आलसी था)। मैं लंबे समय से 3.x संगत वाक्यविन्यास में 2.7 कोड लिख रहा था, इसलिए मुझे वास्तव में उन्हें उपयोग करने की आवश्यकता महसूस नहीं हुई। आपका माइलेज अलग-अलग हो सकता है और अगर यह बहुत काम की तरह लगता है तो इस रास्ते पर सेट न हों ।
इसके बजाय, मैंने इस प्रकार की सामग्री के साथ एक py223.py (57 LOC incl। टिप्पणियाँ) बनाईं , जिनमें से अधिकांश का संबंध डिपॉजिटेशन के लिए वर्कअराउंड और मानक लाइब्रेरी में नाम परिवर्तन से है।
try:
basestring_ = basestring
except (NameError,) as e:
basestring_ = str
try:
cmp_ = cmp
except (NameError,) as e:
# from http://portingguide.readthedocs.io/en/latest/comparisons.html
def cmp_(x, y):
"""
Replacement for built-in function cmp that was removed in Python 3
"""
return (x > y) - (x < y)
फिर उन विशिष्ट चिंताओं के आसपास काम करने के लिए उस py223 से आयात करें। बाद में मैं बस आयात को खोदूंगा और उन अजीबों isinstance(x, basestr_)
को आगे बढ़ाऊंगा isinstance(x, str)
लेकिन मुझे पहले से पता है कि चिंता करने की कोई बात नहीं है।