2012-03-27 16 views
9

Tôi bắt đầu học Python, nhưng tôi buộc phải sử dụng một phiên dịch v2.6.2.Tôi nên nhập các tính năng __future__ nào trong Python v2.6.2?

Tôi muốn để có được càng gần càng tốt để Python 3, ví dụ, bằng cách sử dụng chức năng print mới, "true" bộ phận vv

from __future__ import division 
from __future__ import print_function 
print(1/2, file=sys.stderr) # 0.5 

Những tính năng khác mà tôi cần nhập khẩu từ __future__?

Tôi đoán tôi có thể làm một số chung import __future__ nhưng sau đó tôi sẽ nhận được hành vi khác khi tôi nâng cấp lên phiên bản cao hơn (v2.7 có thể có nhiều tính năng hơn trong __future__) và tập lệnh của tôi có thể ngừng hoạt động.

+0

Bạn có chắc chắn điều này là khôn ngoan không? Nếu bạn buộc phải sử dụng Python 2.x, và bạn bắt đầu viết mã theo kiểu Python 3.x, sẽ không ai hấp dẫn bạn sử dụng 2.x phàn nàn? –

+1

@DavidHeffernan: Không, tôi có thể viết kịch bản của mình theo cách mình muốn. Nó chỉ là tôi đang trên một máy tính cũ có cài đặt Python v2.6.2, và cài đặt Python v3 ngoài dường như không phải là một lựa chọn. – Frank

+1

Cài đặt Python 3 hoàn toàn là một lựa chọn – Amber

Trả lời

7

Vâng, thậm chí nếu không có documentation, __future__ cũng là một mô-đun thường xuyên có một số thông tin về bản thân:

>>> import __future__ 
>>> __future__.all_feature_names 
['nested_scopes', 'generators', 'division', 'absolute_import', 'with_statement', 'print_function', 'unicode_literals'] 
>>> __future__.unicode_literals 
_Feature((2, 6, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 131072) 

Python 2.6 có hầu hết các tính năng đã được kích hoạt, nên chọn từ division, print_function, absolute_importunicode_literals.

Và không, import __future__ sẽ không hoạt động như bạn nghĩ. Nó chỉ là ma thuật khi bạn sử dụng biểu mẫu from __future__ import something làm tuyên bố đầu tiên trong tệp. Xem the docs để biết thêm.

Tất nhiên, bất kể bạn nhập bao nhiêu từ __future__, bạn sẽ nhận được hành vi khác trong 3.x.

+0

Tôi sẽ bỏ qua 'unicode_literals', xem http://stackoverflow.com/questions/809796/any-gotchas-using-unicode-literals-in-python-2-6 – agf

+1

@agf đó là những cách mà mã có thể phá vỡ nếu bạn chỉ cần thêm một cách mù quáng 'unicode_literals', nhưng chúng chỉ đơn giản là trỏ đến những thứ mà lẽ ra phải được sửa lại. Cách tiếp cận của Python 3 đối với unicode đơn giản là hợp lý hơn. –

+0

@KarlKnechtel Nick Coglan hoặc Raymond Hettinger khuyên bạn nên sử dụng nó, nói rằng việc đưa nó vào '__future__' là một sai lầm. Tôi không nhớ nếu nó đã được ở đây trên SO hoặc trong một bài đăng blog. Tôi chỉ sử dụng liên kết đó bởi vì tôi không thể tìm thấy cái tôi đang nghĩ đến ngay bây giờ. – agf

7

Tôi nên nhập những tính năng nào khác từ __future__?

Để có được hành vi cập nhật nhất, tất nhiên bạn nên nhập mọi tính năng __future__ được cung cấp, ngoại trừ đối tượng địa lý mà bạn nhận được. (Cách hệ thống được thiết lập, tính năng cũ không giảm ngay cả sau khi họ luôn-on).

Lưu ý rằng import __future__ sẽ không cung cấp cho bạn tất cả mọi thứ, và không phải ý chí from __future__ import *. Cú pháp from ... import ... được đặt biệt cho __future__ (cách hoạt động), nhưng __future__ vẫn là mô-đun thực mà bạn có thể nhập với import __future__. Tuy nhiên, làm như vậy sẽ cho bạn biết tên tính năng thực tế, cũng như thông tin về thời điểm chúng được (hoặc được dự kiến ​​là) được tạo mặc định và khi chúng có sẵn.

>>> [ 
...  name for name in __future__.all_feature_names if 
...  getattr(__future__, name).optional <= 
...  sys.version_info < 
...  getattr(__future__, name).mandatory 
... ] 

['division', 'print_function', 'unicode_literals'] 

là những gì tôi nhận được trên 2.7.2.

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