2011-09-21 10 views
11

biri Python tamamlanması atamaları gerektirir ve bir alıştırma olarak, böyle bir komut dosyası kullanarak, emin programlarım Python 2 ve Python 3 hem çalışmak hazırlamakta olduğunuz:Python 3'ün "menzili" Python 2'ye "backporting" kötü bir fikir mi? benim sınıfların

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

Bir

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 

bu kötü bir fikir mi: Ben yapıyorum şey range işi bu kod parçası ile iki sürümünde de aynı yapıyor?

DÜZENLEME:

Bunun nedeni xrange ve Python 2 ve Python 3 farklı range eser ve benim kod hem de aynı şeyi yapmak istiyorum olmasıdır. Bunu başka bir şekilde yapabilirim, fakat Python 3'ün Python 2 gibi çalışmasını sağlıyorum çünkü Python 3 “gelecek”. Açıkçası listesini kullanarak değilim

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

ancak Python 2'de, bu belleğin bir deli miktarı kullanacağız:

İşte sadece range kullanarak yeterince iyi değil neden bir örnek.

+1

Gerçekten Python 2'nin aralığı ile çalışmıyor? –

+1

Bunun kötü bir fikir olduğunu söyleyemem, ama 'range' adını yeniden kullanmak kötü olurdu. Python 2.x kodunda "range" i görüyorsam, bir listeyi döndürmesini ve bir yineleyici olmadığını ve adın yeniden atanıp atanmadığını görmek için kodda arama yapmak zorunda kalmamayı beklerdim. Muhtemelen Python 3.x'te tanımlanmadığı gibi, farklı bir ismi hep birlikte kullanmak veya 'xrange'i tekrar kullanmak daha kolay olurdu. –

+1

Ne yapıyorsun? Xrange' ile çalışıyor ama Python 2.x'in 'range' ile çalışmıyor? –

cevap

8

Bir Python 2 ve 3 uyumluluk kütüphane sağlar ve Python çekirdek geliştirici bir kişi tarafından yazılan six paketi kullanabilirsiniz. >range - Özellikleri arasında xrange dahil değiştirildi modülleri ve fonksiyonları için standart tanımların bir kümesidir. six kullanımı, Python Dokümantasyon setinde yer alan resmi Porting Python 2 Code to Python 3 HOWTO'daki birçok tavsiyeden biridir.

6

muhtemelen sonuç 3.x temiz çalıştığından emin o temiz 2.x altında çalışır yapıyor yapıyor ve sonra 2to3 geçirilerek ve doğrulama olması gerekenler Bu şekilde, zaten yaptığınız gibi range yeniden tanımlamak gibi çemberlerden geçmek zorunda kalmayacaksınız.

+1

onarıcılarına sağlamak için lib2to3 çerçevesi üzerine inşa [3to2] (https://bitbucket.org/amentajo/lib3to2/overview) projesi ve bir komut dosyası için de var tersi yapmak, bu durumda daha yararlı olabilir. –

+2

2 satırlık kod "çemberler arasında zıplayarak" nasıl olur, ancak 2to3'ten geçmek sürekli olarak değil mi? –

+1

Bu iki satırlık kod * şimdi *. Bittiğinde, kaç değişiklik gerektiğini bilen var. –

İlgili konular