2011-09-21 9 views
11

एक मेरी कक्षाओं के अजगर में पूरा होने की कार्य की आवश्यकता है, और एक अभ्यास के रूप में, मैं लगाते आ रहे हैं यकीन है कि मेरे कार्यक्रमों दोनों अजगर 2 और अजगर 3 में काम करते हैं, इस तरह एक स्क्रिप्ट का उपयोग:पाइथन 3 की 'रेंज' को पाइथन 2 में "बैकपोर्टिंग" एक बुरा विचार है?

#!/bin/bash 
# Run some PyUnit tests 
python2 test.py 
python3 test.py 

एक

import sys 

# Backport Python 3's range to Python 2 so that this program will run 
# identically in both versions. 
if sys.version_info < (3, 0): 
    range = xrange 

इस एक बुरा विचार है: बात मैं कर रहा हूँ range काम कोड के इस टुकड़े के साथ दोनों संस्करणों में एक ही कर रही है?

संपादित करें:

इस का कारण यह है कि xrange और अजगर 2 और अजगर 3 में अलग range काम करते हैं, और मैं अपने कोड दोनों में एक ही बात करना चाहता हूँ। मैं इसे दूसरी तरफ कर सकता था, लेकिन पाइथन 3 की तरह पायथन 3 काम करना बेवकूफ लगता है, क्योंकि पाइथन 3 "भविष्य" है।

यहाँ क्यों सिर्फ range का उपयोग कर काफी अच्छा नहीं है की एक उदाहरण है:

for i in range(1000000000): 
    do_something_with(i) 

मैं स्पष्ट रूप से सूची का उपयोग नहीं कर रहा हूँ, लेकिन अजगर 2 में, इस स्मृति के एक पागल राशि का उपयोग करेगा।

+1

यह वास्तव में पायथन 2 की सीमा के साथ काम नहीं करता है? –

+1

मैं नहीं कहूंगा कि यह एक बुरा विचार है, लेकिन नाम 'श्रेणी' का पुन: उपयोग करना बुरा होगा। अगर मुझे पायथन 2.x कोड में 'रेंज' दिखाई देता है, तो मैं उम्मीद करता हूं कि यह एक सूची लौटाएगा और एक इटरेटर नहीं होगा और यह देखने के लिए कोड को खोजना होगा कि नाम फिर से सौंप दिया गया है या नहीं। शायद एक साथ अलग-अलग नामों का उपयोग करना आसान होगा या इसके बजाय 'xrange' का पुन: उपयोग करना आसान होगा क्योंकि इसे पायथन 3.x में परिभाषित नहीं किया गया है। –

+1

आप क्या कर रहे हैं जो 'xrange' के साथ काम करता है लेकिन पायथन 2.x की' रेंज' नहीं है? –

उत्तर

8

आप six पैकेज का उपयोग कर सकते हैं जो एक पायथन 2 और 3 संगतता लाइब्रेरी प्रदान करता है और पाइथन कोर डेवलपर्स में से एक द्वारा लिखित है। इसकी विशेषताओं में नामित मॉड्यूल और कार्यों के लिए मानक परिभाषाओं का एक सेट है, जिसमें xrange ->range शामिल हैं। six का उपयोग पाइथन दस्तावेज़ीकरण सेट में आधिकारिक Porting Python 2 Code to Python 3 HOWTO में कई सिफारिशों में से एक है।

6

क्या आप शायद कर यकीन है कि यह सफाई से 2.x के तहत काम करता बना रही है, और फिर 2to3 के माध्यम से इसे पारित करने और यह सत्यापित किया जाना चाहिए कि परिणाम 3.x. में सफाई से काम करता है इस तरह आपको हुप्स से गुज़रना पड़ेगा जैसे कि range को फिर से परिभाषित करना जैसा आपने पहले ही किया है।

+1

[3to2] (https://bitbucket.org/amentajo/lib3to2/overview) प्रोजेक्ट भी है, जो फ़िक्सर्स और स्क्रिप्ट प्रदान करने के लिए lib2to3 ढांचे पर बनाता है रिवर्स कर रहे हैं, यह इस मामले में और अधिक उपयोगी हो सकता है। –

+2

"हुप्स के माध्यम से कूदने" कोड की 2 पंक्तियां कैसे होती हैं, लेकिन इसे लगातार '2to3' के माध्यम से गुजरना नहीं है? –

+1

यह कोड की दो पंक्तियां * अब * है। कौन जानता है कि एक बार किए जाने के बाद कितने बदलाव की आवश्यकता होगी। –

संबंधित मुद्दे