2011-09-21 49 views
11

我的一個班的作業需要在Python完成,並作爲練習,我已經確保我的計劃在這兩個Python 2和Python 3中工作,使用這樣的腳本:將Python 3的「範圍」「反向移植」到Python 2是一個壞主意嗎?

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

一我一直在做的事情是讓range工作在兩個版本相同的用這段代碼:

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 

這是一個壞主意?

編輯:

這樣做的原因是,xrange和在Python 2和Python 3 range工作方式不同,我希望我的代碼做同樣的事情在這兩個。我可以用相反的方法做到這一點,但是讓Python 3像Python 2一樣工作似乎很愚蠢,因爲Python 3是「未來」。

這就是爲什麼僅僅使用range不夠好例子:

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

我明明沒有使用之列,但在Python 2,這將使用的內存的瘋狂量。

+1

它真的不適用於Python 2的範圍? –

+1

我不會說這是個壞主意,但重用名稱'range'會很糟糕。如果我在Python 2.x代碼中看到'range',我希望它返回一個列表而不是迭代器,並且不必遍歷代碼來查看名稱是否已被重新分配。它可能會更容易使用一個不同的名字,甚至重複使用'xrange',因爲它沒有在Python 3.x中定義。 –

+1

你在做什麼和'xrange'一起工作,但不是Python 2.x的'range'? –

回答

8

您可以使用six軟件包,該軟件包提供Python 2和3兼容性庫,並由Python核心開發人員編寫。其功能之一是爲重命名的模塊和功能提供一組標準定義,其中包括xrange - >range。使用six是Python文檔集中包含的官方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

這是兩行代碼*現在*。誰知道一旦完成需要多少更改。 –