Câu hỏi __Future__ là gì trong Python được sử dụng và cách thức / khi nào sử dụng nó, và cách nó hoạt động


Những người bao gồm tôi biết có cái gì đó trong Python được gọi là __future__ và nó xuất hiện trong một vài mô-đun tôi đã đọc. Và những người ngu si đần độn như tôi không biết tại sao nó ở đó, và làm thế nào / khi nào sử dụng nó, ngay cả sau khi đọc của Python __future__ doc.

Vì vậy, bất kỳ giải thích với các ví dụ để chứng minh nó?

Tôi đã có một vài câu trả lời nhanh chóng, mà nhìn tất cả chính xác, về mặt sử dụng cơ bản.

Tuy nhiên và cũng để hiểu thêm về cách thức __future__ công trinh:

Tôi chỉ nhận ra một điều quan trọng đã gây nhầm lẫn cho tôi khi tôi cố gắng hiểu nó, đó là, làm thế nào một bản phát hành python hiện tại bao gồm một cái gì đó sẽ được phát hành trong bản phát hành trong tương lai? và làm thế nào một chương trình có thể sử dụng một tính năng mới trong bản phát hành python trong tương lai được biên dịch thành công bởi bản phát hành python hiện tại?

Vì vậy, tôi đoán bây giờ, bản phát hành hiện tại đã đóng gói một số tính năng tiềm năng sẽ được đưa vào bản phát hành trong tương lai - điều này có đúng không? nhưng các tính năng chỉ khả dụng bởi __future__, đó là bởi vì nó chưa trở thành tiêu chuẩn - tôi có đúng không?


414
2017-08-16 07:52


gốc


Đây là đề xuất ban đầu cho tuyên bố trong tương lai. Tôi thấy nó hữu ích trong việc hiểu tại sao nó có ở nơi đầu tiên và vì vậy khi nào và làm thế nào để sử dụng nó theo cách tự nhiên. python.org/dev/peps/pep-0236 - Jpaji Rajnish
Về cơ bản nó tương đương với "Tôi đoán bạn chưa sẵn sàng cho việc này, nhưng con bạn sẽ thích nó". - Jean-François Corbett


Các câu trả lời:


Với __future__ bao gồm mô-đun, bạn từ từ có thể quen với những thay đổi không tương thích hoặc những thay đổi đó giới thiệu từ khóa mới.

Ví dụ: để sử dụng trình quản lý ngữ cảnh, bạn phải làm from __future__ import with_statement trong 2.5, là with từ khóa mới và không được sử dụng làm tên biến nữa. Để có thể sử dụng một chương trình sử dụng các biến có tên with, cần có tuyên bố nhập ở trên.

Một ví dụ khác là

from __future__ import division
print 8/7  # prints 1.1428571428571428
print 8//7 # prints 1

Không có __future__ công cụ, cả hai print báo cáo sẽ in 1.

Sự khác biệt bên trong là nếu không có nhập khẩu đó, / được ánh xạ tới __div__() phương pháp, trong khi với nó, __truediv__() Được sử dụng. (Trong bất kỳ trường hợp nào, // cuộc gọi __floordiv__().)

Một đề xuất print: print trở thành một hàm trong 3.x, mất thuộc tính đặc biệt của nó làm từ khóa. Vì vậy, nó là cách khác tròn.

>>> print

>>> from __future__ import print_function
>>> print
<built-in function print>
>>>

237
2017-08-16 07:56



đừng quên from __future__ import braces : p - MatToufoutu
@zoogleflatt Nếu bạn là một anh chàng tab, bạn không biết PEP 8. Nó được khuyến khích mạnh mẽ để không phải sử dụng các tab ... - glglgl
@glglgl Vâng về mặt kỹ thuật nó chỉ nói rằng họ đang ưa thích. Nó không hoàn toàn rõ ràng với tôi sau khi đọc lý do tại sao điều này là chính xác, tôi đoán nó có mức độ thụt lề phù hợp chính xác để làm cho neater mã? - Jpaji Rajnish
@zoogleflatt Nó chắc chắn cũng phải làm với thực tế là hầu hết mọi người sử dụng 4 không gian cho 1 cấp độ thụt đầu dòng, vì lý do tương thích, một tab tương đương với 8 dấu cách và các tab và không gian được ngăn cản (resp., AFAIK, thậm chí không được phép Py3) - glglgl
emacswiki.org/pics/static/TabsSpacesBoth.png - Owen


Khi bạn làm

from __future__ import whatever

Bạn không thực sự đang sử dụng import tuyên bố, nhưng tuyên bố trong tương lai. Bạn đang đọc tài liệu sai, vì bạn không thực sự nhập mô-đun đó.

Các câu lệnh trong tương lai là đặc biệt - chúng thay đổi cách phân tích mô-đun Python của bạn, đó là lý do tại sao chúng phải ở đầu tệp. Họ cung cấp cho mới - hoặc khác nhau - ý nghĩa cho các từ hoặc ký hiệu trong tập tin của bạn. Từ tài liệu:

Một câu lệnh trong tương lai là một chỉ thị cho trình biên dịch mà một mô-đun cụ thể sẽ được biên dịch bằng cách sử dụng cú pháp hoặc ngữ nghĩa sẽ có sẵn trong một bản phát hành tương ứng được chỉ định trong Python. Câu lệnh trong tương lai nhằm mục đích dễ dàng di chuyển sang các phiên bản tương lai của Python để giới thiệu các thay đổi không tương thích với ngôn ngữ. Nó cho phép sử dụng các tính năng mới trên cơ sở từng mô-đun trước khi phát hành trong đó tính năng trở thành tiêu chuẩn.

Nếu bạn thực sự muốn nhập __future__ module, chỉ cần làm

import __future__

và sau đó truy cập nó như bình thường.


130
2017-08-16 08:00



Về mặt kỹ thuật, nó cũng là một câu lệnh nhập khẩu, vì tên liên quan được liên kết với một biến cục bộ. from __future__ import print_function cả hai thay đổi hành vi của print từ khóa và có thời gian chạy ảnh hưởng đến tương đương print_function = __import__("__future__").print_function - ppperry


__future__  là một mô-đun giả mà các lập trình viên có thể sử dụng để kích hoạt các tính năng ngôn ngữ mới không tương thích với trình thông dịch hiện tại. Ví dụ, biểu thức 11/4 hiện đang đánh giá 2. Nếu mô-đun trong đó nó được thực hiện đã cho phép phân chia thực sự bằng cách thực thi:

from __future__ import division

cách diễn đạt 11/4 sẽ đánh giá 2.75. Bằng cách nhập __future__ mô-đun và đánh giá các biến của nó, bạn có thể thấy khi nào một đối tượng địa lý mới được thêm lần đầu tiên vào ngôn ngữ và khi nó sẽ trở thành mặc định:

  >>> import __future__
  >>> __future__.division
  _Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)

87
2018-02-20 20:38



Vì vậy, dựa trên phiên bản phát hành trong các biến, nếu thông dịch viên của bạn đang sử dụng một phiên bản sau hơn là chỉ ra, import __future__ xyz là một no-op? - Ray
Nó tương tự như một polyfill trong thế giới trình duyệt - cs01


Nó có thể được sử dụng để sử dụng các tính năng sẽ xuất hiện trong các phiên bản mới hơn trong khi có phiên bản cũ hơn của Python.

Ví dụ

>>> from __future__ import print_function

sẽ cho phép bạn sử dụng print như một hàm:

>>> print('# of entries', len(dictionary), file=sys.stderr)

33
2017-08-16 08:02





Hoặc là nó giống như nói "Vì đây là python v2.7, sử dụng chức năng 'in' khác nhau mà cũng đã được thêm vào python v2.7, sau khi nó được thêm vào trong python 3. Vì vậy, 'in' của tôi sẽ không còn là câu (ví dụ như in "message") nhưng chức năng (ví dụ, in ("tin nhắn", tùy chọn). Bằng cách đó khi mã của tôi được chạy trong python 3, 'in' sẽ không phá vỡ. "

Trong

from __future__ import print_function

print_function là mô-đun chứa thực thi mới 'in' theo cách nó hoạt động trong python v3.

Điều này giải thích thêm: http://python3porting.com/noconv.html


16
2017-11-15 14:36



Tôi nghĩ bạn muốn nói from __future__ import print_function - antimatter
@gyeh Có lẽ câu trả lời này chỉ hiển thị mã Python 3 'nhập' trong tương lai (cho tương thích trong tương lai của Python 4):} - user2864740
Tôi đã cập nhật mã ở trên để nói 'print_function' là chính xác. - Praym


Một trong những cách sử dụng mà tôi thấy rất hữu ích là print_function từ __future__ mô-đun.

Trong Python 2.7, tôi muốn ký tự từ các câu lệnh in khác nhau được in trên cùng một dòng không có dấu cách.

Nó có thể được thực hiện bằng cách sử dụng một dấu phẩy (",") ở cuối, nhưng nó cũng nối thêm một không gian. Câu lệnh trên khi được sử dụng như:

from __future__ import print_function
...
print (v_num,end="")
...

Điều này sẽ in giá trị của v_num từ mỗi lần lặp trong một dòng đơn không có dấu cách.


3
2018-01-05 15:14





Có một số câu trả lời tuyệt vời đã có, nhưng không ai trong số họ giải quyết một danh sách đầy đủ về những gì __future__ tuyên bố hiện hỗ trợ.

Đơn giản thôi, câu lệnh __future__ buộc các trình thông dịch Python sử dụng các tính năng mới của ngôn ngữ. 

Các tính năng mà hiện tại nó hỗ trợ là:

nested_scopes:

Trước Python 2.1, đoạn mã sau sẽ nâng cao NameError:

def f():
    ...
    def g(value):
        ...
        return g(value-1) + 1
    ...

Các from __future__ import nested_scopes chỉ thị sẽ cho phép tính năng này được bật.

generators:

Giới thiệu các chức năng của máy phát điện như chức năng dưới đây để lưu trạng thái giữa các cuộc gọi hàm liên tiếp:

def fib():
    a, b = 0, 1
    while 1:
       yield b
       a, b = b, a+b

division:

Phân chia cổ điển được sử dụng trong các phiên bản Python 2.x. Có nghĩa là một số câu lệnh phân chia trả lại một phép tính xấp xỉ hợp lý của phân chia ("phân chia thực sự") và một số khác trả về tầng ("phân chia sàn"). Bắt đầu bằng Python 3.0, phân chia thực sự được xác định bởi x/y, trong khi phân chia sàn được xác định bởi x//y.

Các from __future__ import division chỉ thị buộc việc sử dụng phân chia kiểu Python 3.0.

absolute_import:

Cho phép dấu ngoặc đơn đính kèm nhiều import các câu lệnh. Ví dụ:

from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text,
    LEFT, DISABLED, NORMAL, RIDGE, END)

Thay vì:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text, \
    LEFT, DISABLED, NORMAL, RIDGE, END

Hoặc là:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text
from Tkinter import LEFT, DISABLED, NORMAL, RIDGE, END

with_statement:

Thêm câu lệnh "with" làm từ khóa trong Python để loại bỏ nhu cầu try/finally các câu lệnh. Sử dụng phổ biến của điều này là khi thực hiện tập tin I / O như:

with open('workfile', 'r') as f:
     read_data = f.read()

print_function:

Buộc sử dụng kiểu dấu ngoặc đơn Python 3 print gọi hàm thay vì print MESSAGE báo cáo in kiểu.

unicode_literals:

Giới thiệu cú pháp theo nghĩa đen cho bytes vật. Có nghĩa là các câu lệnh như bytes('Hello world', 'ascii')có thể được thể hiện đơn giản như b'Hello world'.

generator_stop:

Thay thế việc sử dụng StopIteration ngoại lệ được sử dụng bên trong các hàm máy phát điện với RuntimeError ngoại lệ.

Một cách sử dụng khác không được đề cập ở trên là __future__ tuyên bố cũng buộc việc sử dụng các trình thông dịch Python 2.1+ vì sử dụng một phiên bản cũ hơn sẽ ném một ngoại lệ thời gian chạy.

Tham khảo:


2
2018-03-11 17:19





Sau khi Python 3.0 trở đi, in không còn là một câu lệnh nữa, thay vào đó là một hàm của nó. và được bao gồm trong PEP 3105.

Ngoài ra tôi nghĩ rằng gói Python 3.0 vẫn có những chức năng đặc biệt này. Cho phép xem khả năng sử dụng của nó thông qua một "chương trình Kim tự tháp" truyền thống bằng Python:

from __future__ import print_function

class Star(object):
    def __init__(self,count):
        self.count = count

    def start(self):
        for i in range(1,self.count):
            for j in range (i): 
                print('*', end='') # PEP 3105: print As a Function 
            print()

a = Star(5)
a.start()

Output:
*
**
***
****

Nếu chúng ta sử dụng chức năng in bình thường, chúng ta sẽ không thể đạt được cùng một đầu ra, vì print () đi kèm với một dòng mới bổ sung. Vì vậy, mỗi khi vòng lặp bên trong thực thi, nó sẽ in * lên dòng tiếp theo.


-3
2018-04-05 11:33