(पायथन) भाषा परिवर्तन के साथ बनाए रखने की रणनीति


16

राइटिंग कोड जो अभी से सालों चलेगा

प्रोग्रामिंग भाषाएँ बदल जाती हैं। पुस्तकालय बदलते हैं। 5, 10 या 20 साल पहले के कुछ कोड अभी भी अपेक्षित परिणाम दे सकते हैं और परिणाम दे सकते हैं, जबकि 2 साल से कुछ कोड एक वाक्यविन्यास त्रुटि के साथ विफल हो सकते हैं। यह आंशिक रूप से अपरिहार्य है, क्योंकि भाषाएं विकसित होती हैं (कम से कम, सबसे अधिक)। डेवलपर्स के पास अपने कोड को बनाए रखने की जिम्मेदारी है। लेकिन कभी-कभी, उत्पादन कोड में स्थिरता एक महत्वपूर्ण आवश्यकता होती है, और भाषा परिवर्तनों के लिए इसे अनुकूलित करने के लिए हर साल कोड के माध्यम से किसी की आवश्यकता के बिना कोड को केवल 10 वर्षों तक चलना चाहिए। उदाहरण के लिए, वैज्ञानिक डेटा विश्लेषण के लिए मेरे पास छोटी स्क्रिप्ट्स हो सकती हैं, जो कि उन्हें सालों तक न छूने के बाद फिर से देखने की जरूरत है। उदाहरण के लिए, मौसम संबंधी कार्यालयों में गैर-गति-आवश्यक भागों के लिए भी बहुत अधिक संचालन फोरट्रान कोड है, और कोड स्थिरता इसका एक कारण है। मैं' अस्थिरता के लिए डर सुनाई देने वाली वस्तुओं में से एक है जो उनके पास पायथन में जाने के खिलाफ है (भाषा की जड़ता के अलावा, यह केवल नए कोड के लिए संभव है पुराने कोड पर निर्भर नहीं है)। बेशक, स्थिर कोड के लिए एक रणनीति पूरे ऑपरेटिंग सिस्टम को फ्रीज करना है। लेकिन वह हमेशा संभव नहीं है।

मैं उदाहरण के तौर पर अजगर का उपयोग कर रहा हूं, लेकिन यह मुद्दा विशेष रूप से अजगर तक सीमित नहीं है।

पायथन संगतता मुद्दों पर दस्तावेज़

पायथन के मामले में, पिछड़े-असंगत बदलावों के लिए कई दस्तावेज रेखांकित करने वाली नीति है।

पीईपी -5

PEP 5 के अनुसार :

पायथन के संक्रमणकालीन संस्करण की रिहाई और पीछे के असंगत संस्करण की रिहाई के बीच कम से कम एक वर्ष की संक्रमण अवधि होनी चाहिए। उपयोगकर्ताओं के पास कम से कम एक वर्ष होगा अपने कार्यक्रमों का परीक्षण करने के लिए और उन्हें वैकल्पिक निर्माण के लिए उपयोग किए गए विकल्प से माइग्रेट करें।

व्यक्तिगत रूप से, मैं मानता हूं कि एक वर्ष कम है। इसका मतलब है कि मैं कुछ कोड लिख सकता हूं, और 1½ साल से यह अब और नहीं चलेगा।

पीईपी 291

पीईपी 291 में उन चीजों के दिशानिर्देशों की एक अपूर्ण सूची शामिल है जिन्हें पिछड़े संगतता बनाए रखने के लिए बचा जाना चाहिए। हालाँकि, यह केवल पायथन 2.x से संबंधित है। जैसा कि पायथन 2.7 2.x श्रृंखला में अंतिम रिलीज है और पायथन 2.7 बगफिक्स-ओनली है, यह पीईपी अब केवल ऐतिहासिक हित के लिए है।

पीईपी 387

पिछड़े-असंगत परिवर्तनों पर पीईपी 387 भी है । पीईपी 387 एक मसौदा है और आधिकारिक नीति नहीं है। जून 2009 में, यह पायथन-विचार मेलिंग-सूची पर चर्चा की गई थी । चर्चा का एक हिस्सा इस बात पर केंद्रित है कि डेवलपर्स कैसे कोड लिख सकते हैं जो भाषा परिवर्तनों के खिलाफ मजबूत है। एक पोस्ट ने कुछ सलाह दी कि क्या करें :

इसके साथ ही ऐसे कई नियम हैं जो आप अनुमान लगा सकते हैं कि शायद यह ज्यादातर समय सच होता है: सामान की शुरुआत न करें "_", बंदर से कुछ भी न करें, अपने स्वयं के अलावा अन्य वर्गों से वस्तुओं पर गतिशील वर्ग प्रतिस्थापन का उपयोग न करें। , वंशानुक्रम पदानुक्रम की गहराई पर निर्भर न करें (उदाहरण के लिए, नहीं ".__bases__[0].__bases__[0]"), यह सुनिश्चित करें कि आपके परीक्षण किसी डिप्रेसेशन वर्जन के निर्माण के बिना चलते हैं, अन्य पुस्तकालयों से प्राप्त होने वाली कक्षाओं में विशेषताओं को जोड़ते समय संभावित नामस्थान संघर्षों से सावधान रहें। मुझे नहीं लगता कि ये सभी बातें एक जगह पर लिखी गई हैं।

इसके अलावा, "माइन फ़ील्ड्स" (नई सुविधाओं के बदलने की संभावना) और "जमे हुए क्षेत्र" (बहुत बेची गई एपीआई वस्तुतः बदलने की गारंटी नहीं है) के बारे में कुछ बिंदु थे। कोटेदार एंटोनी पिटोर :

मुझे लगता है कि "जमे हुए क्षेत्र" को नकारात्मक (स्पष्ट "मेरा क्षेत्र") के बजाय सकारात्मक (स्पष्ट सार्वजनिक एपीआई और स्पष्ट रूप से गारंटीकृत व्यवहार) परिभाषित किया जाना चाहिए। अन्यथा, हम कुछ महत्वपूर्ण चीजों को माइनफील्ड में रखना भूल जाएंगे और बाद में काट लेंगे जब हमें उन चीजों को पीछे-असंगत तरीके से बदलने की आवश्यकता होगी।

इस धागे से कोई निष्कर्ष नहीं निकलता है, लेकिन मैं जो देख रहा हूं, उसके मूल के बहुत करीब पहुंच जाता हूं। धागा लगभग चार साल पुराना है, इसलिए शायद स्थिति बदल गई है या बेहतर हो गई है। किस तरह के कोड के जीवित रहने की संभावना है, और किस तरह का कोड अधिक नाजुक है?

पोर्टिंग दिशानिर्देश

ऊपर उल्लिखित दस्तावेजों के अलावा, प्रत्येक पायथन संस्करण एक पोर्टिंग गाइडलाइन के साथ आता है: पायथन 3.2 को पोर्ट करना, पायथन 3.3 को पोर्ट करना , आदि।

उपयोगी अनुकूलता

पीईपी 3151 ने मुझे उपयोगी अनुकूलता की अवधारणा से परिचित कराया । मेरे स्वयं के शब्दों में, यह इस विचार से उबलता है कि यदि कोड सावधानीपूर्वक लिखा गया है तो भाषा डेवलपर्स को संगतता बनाए रखने के लिए सावधान रहने की आवश्यकता है। यह वास्तव में उपयोगी संगतता को परिभाषित नहीं करता है , लेकिन मुझे लगता है कि यह उन विचारों के समान है जिन्हें मैंने पीईपी 387 चर्चा से ऊपर उद्धृत किया था।

प्रोग्रामर्स के दृष्टिकोण से

एक प्रोग्रामर के रूप में, मुझे पता है कि भविष्य में पायथन बदल जाएगा और यह कि लोग - सबसे ख़ासकर खुद - एक पायथन संस्करण में शायद अब से कई साल पहले मेरा कोड चलाने की कोशिश करेंगे जो एक, दो, या शायद तीन छोटे संस्करण हैं। सब कुछ संगत नहीं होगा, और वास्तव में कोड के साथ आना आसान है जो विफल हो जाएगा (मैं एक बार कोड बताते हुए if sys.version[:3] != '2.3': print 'Wrong version, exiting')। मैं जो देख रहा हूं, वह इस बात पर दिशानिर्देशों का एक सेट है कि क्या करना है और क्या नहीं करना है ताकि इस संभावना को बढ़ाया जा सके कि मेरा कोड अभी भी भविष्य में अनलॉक हो जाएगा।

क्या ऐसे कोई दिशानिर्देश हैं? मैं पायथन कोड कैसे लिखूं जो अभी भी भविष्य में चलेगा?

मेरा प्रश्न, अजगर कोर करने के लिए दोनों से संबंधित है इसके मानक पुस्तकालय के लिए, लेकिन यह भी आमतौर पर इस्तेमाल करने के लिए ऐड-ऑन पुस्तकालयों, विशेष रूप से numpy, scipy, matplotlib


EDIT : अब तक, दो उत्तर python2 बनाम python3 से संबंधित हैं। यह मेरा मतलब नहीं है। मैं Python2 से Python3 की ओर जाने वाले औजारों के बारे में जानता हूं। मेरा प्रश्न अभी आने वाले भाषा परिवर्तनों से संबंधित है । हम कोडिंग दिशानिर्देशों को खोजने में एक क्रिस्टल बॉल से बेहतर कर सकते हैं जो अधिक स्थिर हैं। उदाहरण के लिए:

  • import moduleकी तुलना में अधिक भविष्य-प्रमाण है from module import *, क्योंकि उत्तरार्द्ध moduleएक या अधिक नए कार्यों / वर्गों को बढ़ने पर कोड को तोड़ सकता है ।

  • अप्रकाशित विधियों का उपयोग करना प्रलेखित विधियों का उपयोग करने की तुलना में कम भविष्य का सबूत हो सकता है, क्योंकि कुछ भी अनिर्दिष्ट होने के कारण अभी तक कुछ स्थिर नहीं हो सकता है।

यह इस तरह की व्यावहारिक कोडिंग सलाह है जो मैं बाद में हूं। चूंकि यह वर्तमान → भविष्य के बारे में है, इसलिए हम खुद को Python3 तक सीमित कर सकते हैं, क्योंकि Python2 अब बदलने वाला नहीं है।

जवाबों:


13

यह हमारे क्षेत्र में एक अनसुलझी समस्या है। यह सुनिश्चित करने का कोई तरीका नहीं है कि आपका कोड अनिश्चित काल तक काम करेगा। भले ही आपका कोड वास्तव में संगत-संगत अर्थों में सही था (और यदि यह है, तो कृपया मेरी कंपनी के लिए काम करें;);), अगर यह किसी अन्य सॉफ़्टवेयर द्वारा चलाया जाता है, उपयोग करता है, या इसका उपयोग किया जाता है, जिसे बग या परिवर्तन मिलता है किसी भी तरह से, आपका कोड काम नहीं कर सकता है।

इसलिए मैं आपको ऐसा करने के लिए चीजों की एक सूची नहीं दे सकता, यदि आप उनका पालन करते हैं, तो सफलता की गारंटी होगी। लेकिन आप जो कर सकते हैं वह भविष्य के टूटने के जोखिम को कम करता है और उनके प्रभावों को कम करता है। एक अधिक जानकार पायथन, आपको पायथन के लिए और अधिक विशिष्ट सलाह दे सकेगा, इसलिए मुझे और अधिक जानकारी प्राप्त करनी होगी:

  • इकाई परीक्षण लिखें। यहां तक ​​कि उन चीजों के लिए जिन्हें आप जानते हैं कि उनकी आवश्यकता नहीं है।

  • लोकप्रिय / अच्छी तरह से डिजाइन / स्थिर पुस्तकालयों और प्रौद्योगिकियों का उपयोग करना, अलोकप्रिय से बचने (और इस तरह जल्द ही असमर्थित होने की संभावना है)

  • उस कोड को लिखने से बचें जो कार्यान्वयन विवरण का शोषण करता है। इंटरफेस को कोड, कार्यान्वयन नहीं। एक ही इंटरफ़ेस के कई कार्यान्वयन के खिलाफ कोड। उदाहरण के लिए, अपना कोड CPython, Jython और IronPython में चलाएं और देखें कि क्या होता है। यह आपको आपके कोड के बारे में कुछ बेहतरीन प्रतिक्रिया देगा। यह पायथन 3 के लिए सहायक नहीं हो सकता है - हालांकि मैंने सुना है, कुछ कार्यान्वयन अभी भी पायथन 2 में थे।

  • सरल, स्पष्ट कोड लिखें जो अपनी मान्यताओं के बारे में स्पष्ट हो

  • मॉड्यूलर लिखो, कंपोजेबल कोड। यदि कुछ कोड को कुछ खतरनाक (भविष्य के सबूत के अर्थ में) करना चाहिए, तो इसे अलग करें ताकि भले ही इसे बदलना पड़े, बाकी कोड नहीं।

  • किसी न किसी रूप की विशिष्टता है। यह यूनिट परीक्षणों के बारे में बिंदुओं के समान है, यदि आप एक युक्ति और इंटरफेस के रूप में परीक्षणों का उपयोग करते हैं, जो कि चश्मा के रूप में भी उपयोग किया जा सकता है। (मेरा मतलब सामान्य अर्थों में इंटरफ़ेस है, जावा कीवर्ड सेंस नहीं है)।

इनमें से कोई भी कार्य करने से आपके द्वारा किए जाने वाले कार्य की मात्रा बढ़ जाएगी। मुझे लगता है कि समझ में आता है - इनमें से बहुत सारे बिंदु अच्छे कोड लिखने के लिए भी बनाए जा सकते हैं, जो काफी मुश्किल है (मेरी राय में)। कभी-कभी आपको इनमें से कुछ सुझावों का उल्लंघन करने की आवश्यकता हो सकती है। यह पूरी तरह से स्वीकार्य है, लेकिन लागत के बारे में पता होना चाहिए।

यह बहुत अच्छा है कि पायथन टीम इस बारे में सोच रही है, और निश्चित रूप से वे पहले से कहीं अधिक प्रतिभाशाली और कुशल हैं। फिर भी, मुझे लगता है कि 100% है कि किसी का कोड कहीं न कहीं उस तरह से काम करना बंद कर देगा जैसा कि पाइथन के अपग्रेड होने पर करना है।


4

इसे कॉन्फ़िगरेशन प्रबंधन कहा जाता है। यदि सिस्टम कभी नहीं बदला जाता है, तो इसे तोड़ना नहीं चाहिए। इसलिए सिस्टम को न बदलें। नए पायथन रिलीज के बारे में चिंतित हैं? अपग्रेड न करें। नए डिवाइस ड्राइवरों के बारे में चिंतित हैं? अपग्रेड न करें। विंडोज पैच के बारे में चिंतित हैं? ...


0

पायथन 2 के लिए -> पायथन 3, पहले से स्थापित एक पायथन 2to3 पुस्तकालय है (यह मूल पायथन पैकेज के साथ आता है)।

इसके आधार पर, नए संस्करण जारी होने के तुरंत बाद, समान पुस्तकालय होने चाहिए जो प्रत्येक नए संस्करण के साथ आते हैं। हालाँकि, जैसा कि मार्टिज़न ने कहा है, इन जैसे पुस्तकालयों को केवल प्रमुख संस्करणों (जैसे संस्करण 3.0) के लिए जारी किया जाएगा, लेकिन मामूली संस्करणों (जैसे 3.2) के लिए नहीं। हालांकि, 3.0 और 3.2 (या किसी अन्य मामूली संस्करण) के बीच, कोई संगतता समस्या नहीं होनी चाहिए, इसलिए संस्करण 3.0 में परिवर्तित करना ठीक होना चाहिए।

इसके अलावा, मेरा सुझाव है कि आप इस प्रश्न को देखें


1
नहीं, 2to3 केवल आपको प्रमुख संस्करण गैप में कोड अपग्रेड करने में मदद करता है; छोटे संस्करणों में कोड को अपग्रेड करने के लिए कोई लाइब्रेरी (आवश्यक) नहीं है।
मार्टिज़न पीटर 17

@MartijnPieters छोटे संस्करणों में संगतता समस्याएँ नहीं होनी चाहिए, क्योंकि अत्यधिक बड़े परिवर्तन नहीं होने चाहिए। यदि संगतता समस्याएं और बड़े परिवर्तन हैं, तो एक पूरी तरह से नया संस्करण जारी किया जाना चाहिए।

0

मुझे जोड़ने के लिए बहुत कुछ नहीं है, "2 के लिए प्रोग्राम, और 2to3 का उपयोग करें" लगता है कि इंटरनेट के आसपास हाल ही में एक आम जोड़-तोड़ है। हालाँकि कुछ ऐसी चीजें हैं जिन्हें आपको देखना चाहिए:

इसे छह (पीपीआई पेज) कहा जाता है । यह एक अजगर लाइब्रेरी है जो लिखने के कोड को मदद करने के लिए समर्पित है जो अजगर 2 और अजगर 3 पर चलता है। मैंने इसे कई परियोजनाओं में काम करते हुए देखा है, जबकि यह नेट के आसपास है, लेकिन नाम फिलहाल मुझसे बचते हैं।


वास्तव में मैं उसके बाद नहीं हूं। मैंने प्रश्न संपादित किया है, उम्मीद है कि यह अधिक स्पष्ट है जो मैं अभी देख रहा हूं।
जेरिट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.