2011-09-21 32 views
11

Một trong lớp học của tôi đòi hỏi phải có nhiệm vụ sẽ hoàn thành vào Python, và như một bài tập, tôi đã đảm bảo chương trình của tôi làm việc trong cả hai Python 2 và Python 3, sử dụng một kịch bản như thế này:Có phải "backporting" phạm vi `Python` của Python 3 thành Python 2 là một ý tưởng tồi không?

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

Một điều tôi đã làm là làm cho range hoạt động tương tự trong cả hai phiên bản với đoạn mã này:

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 

Đây có phải là một ý tưởng tồi không?

EDIT:

Lý do cho điều này là xrangerange và hoạt động khác trong Python 2 và Python 3, và tôi muốn mã của tôi để làm điều tương tự trong cả hai. Tôi có thể làm điều đó theo cách khác, nhưng làm cho Python 3 hoạt động như Python 2 có vẻ ngu ngốc, vì Python 3 là "tương lai".

Dưới đây là một ví dụ về lý do tại sao chỉ sử dụng range là không đủ tốt:

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

Tôi rõ ràng là không sử dụng danh sách, nhưng trong Python 2, điều này sẽ sử dụng một số tiền điên của bộ nhớ.

+1

Nó thực sự không hoạt động với phạm vi của Python 2? –

+1

Tôi sẽ không nói đó là một ý tưởng tồi, nhưng nó sẽ là một xấu để tái sử dụng tên 'phạm vi'. Nếu tôi thấy 'phạm vi' trong mã Python 2.x, tôi sẽ mong đợi nó trả về một danh sách và không phải là một trình lặp và không phải tìm kiếm qua mã để xem tên đã được gán lại hay chưa. Nó có thể sẽ dễ dàng hơn khi sử dụng một tên khác với nhau hoặc thậm chí tái sử dụng 'xrange' thay vì nó không được định nghĩa trong Python 3.x. –

+1

Bạn đang làm gì với 'xrange' nhưng không phải là' phạm vi' của Python 2.x? –

Trả lời

8

Bạn có thể sử dụng gói six cung cấp thư viện tương thích Python 2 và 3 và được viết bởi một trong những nhà phát triển lõi Python. Trong số các tính năng của nó là tập hợp các định nghĩa chuẩn cho các mô-đun và chức năng được đổi tên, bao gồm xrange ->range. Việc sử dụng six là một trong nhiều đề xuất trong số Porting Python 2 Code to Python 3 HOWTO chính thức được bao gồm trong bộ Tài liệu Python.

6

Những gì bạn có thể nên đang thực hiện là đảm bảo nó hoạt động sạch dưới 2.x và sau đó truyền qua 2to3 và xác minh rằng kết quả hoạt động hiệu quả trong 3.x. Bằng cách đó bạn sẽ không phải trải qua các vòng lặp như xác định lại range như bạn đã làm.

+1

cũng có dự án [3to2] (https://bitbucket.org/amentajo/lib3to2/overview), được xây dựng trên khung lib2to3 để cung cấp các trình sửa lỗi và tập lệnh cho làm ngược lại, nó có thể hữu ích hơn trong trường hợp này. –

+2

Làm thế nào là 2 dòng mã "nhảy qua hoops", nhưng đi qua nó thông qua '2to3' liên tục không? –

+1

Đó là hai dòng mã * bây giờ *. Ai biết được bao nhiêu thay đổi sẽ được yêu cầu sau khi thực hiện. –

Các vấn đề liên quan