Untuk apa __future__ dalam Python digunakan dan bagaimana / kapan menggunakannya, dan cara kerjanya

693

__future__sering muncul dalam modul Python. Saya tidak mengerti apa __future__yang untuk dan bagaimana / kapan menggunakannya bahkan setelah membaca yang Python __future__doc .

Adakah yang bisa menjelaskan dengan contoh?

Beberapa jawaban mengenai penggunaan dasar yang __future__saya terima tampak benar.

Namun, saya perlu memahami satu hal lagi tentang cara __future__kerjanya:

Konsep yang paling membingungkan bagi saya adalah bagaimana rilis python saat ini termasuk fitur untuk rilis di masa depan, dan bagaimana program menggunakan fitur dari rilis masa depan dapat dikompilasi dengan sukses dalam versi Python saat ini.

Saya menduga bahwa rilis saat ini dikemas dengan fitur-fitur potensial untuk masa depan. Namun, fitur hanya tersedia dengan menggunakan __future__karena mereka bukan standar saat ini. Beri tahu saya jika saya benar.

leslie
sumber
10
Ini adalah proposal asli untuk pernyataan di masa depan. Saya menemukan itu membantu dalam memahami mengapa itu ada di tempat pertama dan kapan dan bagaimana menggunakannya ikuti secara alami. python.org/dev/peps/pep-0236
Jpaji Rajnish
54
Ini pada dasarnya setara dengan "Saya kira Anda tidak siap untuk ini, tetapi anak-anak Anda akan menyukainya" .
Jean-François Corbett
3
Pernyataan di masa mendatang adalah arahan ke kompiler bahwa modul tertentu harus dikompilasi menggunakan sintaks atau semantik yang akan tersedia dalam rilis Python mendatang yang ditentukan. Pernyataan di masa depan dimaksudkan untuk memudahkan migrasi ke versi Python di masa depan yang memperkenalkan perubahan yang tidak kompatibel ke bahasa. Ini memungkinkan penggunaan fitur-fitur baru pada basis per-modul sebelum rilis di mana fitur menjadi standar.
shivam13juna

Jawaban:

384

Dengan __future__dimasukkannya modul, Anda dapat perlahan-lahan terbiasa dengan perubahan yang tidak kompatibel atau yang memperkenalkan kata kunci baru.

Misalnya, untuk menggunakan manajer konteks, Anda harus melakukannya from __future__ import with_statementdalam 2,5, karena withkata kunci itu baru dan tidak boleh digunakan sebagai nama variabel lagi. Untuk menggunakan withkata kunci Python di Python 2.5 atau lebih, Anda harus menggunakan impor dari atas.

Contoh lain adalah

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

Tanpa __future__barang, kedua printpernyataan akan dicetak 1.

Perbedaan internal adalah bahwa tanpa impor itu, /dipetakan ke __div__()metode, sementara dengan itu, __truediv__()digunakan. (Bagaimanapun, //panggilan __floordiv__().)

Apropos print: printmenjadi fungsi dalam 3.x, kehilangan properti khusus sebagai kata kunci. Jadi sebaliknya.

>>> print

>>> from __future__ import print_function
>>> print
<built-in function print>
>>>
glglgl
sumber
151
jangan lupa from __future__ import braces: p
mdeous
13
@zoogleflatt Jika Anda lebih menyukai tab, Anda tidak tahu PEP 8. Sangat disarankan untuk tidak menggunakan tab ...
glglgl
5
@glglgl Yah secara teknis hanya mengatakan mereka lebih disukai. Tidak sepenuhnya jelas bagi saya setelah membaca mengapa ini persis, saya kira itu memiliki tingkat indentasi yang tepat untuk membuat kode lebih rapi?
Jpaji Rajnish
4
@zoogleflatt Tentunya juga ada hubungannya dengan fakta bahwa kebanyakan orang menggunakan 4 spasi untuk 1 tingkat indentasi, bahwa untuk alasan kompatibilitas satu tab setara dengan 8 spasi dan pencampuran tab dan spasi tidak dianjurkan (resp., AFAIK, bahkan tidak diizinkan dalam Py3)
glglgl
1
@whiteSkar Saya saat ini tidak up to date dengan versi yang lebih baru dari python 3, tapi saya berasumsi bahwa itu masih digunakan, hanya saja Anda mungkin tidak memerlukannya dengan fitur-fitur yang cukup lama ini. Dalam Python 3, printsudah pasti sebuah fungsi, tetapi mungkin ada fitur lain yang mungkin digunakan __future__. (Edit: lihat docs.python.org/3/library/__future__.html di mana masih digunakan.)
glglgl
195

Saat kamu melakukan

from __future__ import whatever

Anda sebenarnya tidak menggunakan importpernyataan, tetapi pernyataan di masa depan . Anda membaca dokumen yang salah, karena Anda sebenarnya tidak mengimpor modul itu.

Pernyataan di masa depan adalah khusus - mereka mengubah bagaimana modul Python Anda diuraikan, itulah sebabnya mereka harus ada di bagian atas file. Mereka memberikan arti baru - atau berbeda - pada kata atau simbol dalam file Anda. Dari dokumen:

Pernyataan di masa depan adalah arahan ke kompiler bahwa modul tertentu harus dikompilasi menggunakan sintaks atau semantik yang akan tersedia dalam rilis Python mendatang yang ditentukan. Pernyataan di masa depan dimaksudkan untuk memudahkan migrasi ke versi Python di masa depan yang memperkenalkan perubahan yang tidak kompatibel ke bahasa. Ini memungkinkan penggunaan fitur-fitur baru pada basis per-modul sebelum rilis di mana fitur menjadi standar.

Jika Anda benar-benar ingin mengimpor __future__modul, lakukan saja

import __future__

dan kemudian mengaksesnya seperti biasa.

agf
sumber
4
Secara teknis, ini juga merupakan pernyataan impor, karena nama yang relevan terikat ke variabel lokal. from __future__ import print_functionkeduanya mengubah perilaku printkata kunci dan memiliki dampak runtime yang setara denganprint_function = __import__("__future__").print_function
pppery
112

__future__ adalah pseudo-module yang dapat digunakan programmer untuk mengaktifkan fitur bahasa baru yang tidak kompatibel dengan penerjemah saat ini . Misalnya, ekspresi yang 11/4sedang dievaluasi untuk 2. Jika modul yang dijalankan telah mengaktifkan pembagian yang benar dengan mengeksekusi:

from __future__ import division

ekspresi 11/4akan dievaluasi menjadi 2.75. Dengan mengimpor __future__modul dan mengevaluasi variabel-variabelnya, Anda dapat melihat kapan fitur baru pertama kali ditambahkan ke bahasa dan kapan akan menjadi default:

  >>> import __future__
  >>> __future__.division
  _Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)
CodeArtist
sumber
1
Jadi, berdasarkan versi rilis dalam variabel, jika penerjemah Anda menggunakan versi yang lebih baru dari yang ditunjukkan, apakah import __future__ xyzitu no-op?
Ray
4
Ini agak analog dengan polyfill di dunia peramban
cs01
47

Ini dapat digunakan untuk menggunakan fitur yang akan muncul di versi yang lebih baru sambil memiliki rilis Python yang lebih lama.

Sebagai contoh

>>> from __future__ import print_function

akan memungkinkan Anda untuk digunakan printsebagai fungsi:

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

Sudah ada beberapa jawaban yang bagus, tetapi tidak ada satupun dari mereka yang membahas daftar lengkap apa yang __future__didukung oleh pernyataan tersebut.

Sederhananya, para __future__pernyataan memaksa Python interpreter untuk menggunakan fitur baru dari bahasa.


Fitur yang didukung saat ini adalah sebagai berikut:

nested_scopes

Sebelum Python 2.1, kode berikut akan memunculkan NameError :

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

The from __future__ import nested_scopesdirektif akan memungkinkan untuk fitur ini diaktifkan.

generators

Fungsi-fungsi generator yang diperkenalkan seperti yang di bawah ini untuk menghemat keadaan antara panggilan fungsi yang berurutan:

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

division

Divisi klasik digunakan dalam versi Python 2.x. Berarti bahwa beberapa pernyataan divisi mengembalikan perkiraan divisi yang wajar ("divisi sejati") dan yang lain mengembalikan lantai ("divisi lantai"). Dimulai dengan Python 3.0, pembagian sejati ditentukan oleh x/y, sedangkan pembagian lantai ditentukan oleh x//y.

The from __future__ import divisionpasukan arahan penggunaan Python 3.0 divisi gaya.

absolute_import

Mengizinkan kurung melampirkan banyak importpernyataan. Sebagai contoh:

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

Dari pada:

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

Atau:

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

with_statement

Menambahkan pernyataan withsebagai kata kunci dalam Python untuk menghilangkan kebutuhan akan try/finallypernyataan. Penggunaan umum ini adalah ketika melakukan file I / O seperti:

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

print_function:

Memaksa penggunaan print()panggilan fungsi gaya kurung Python 3 alih-alih print MESSAGEpernyataan gaya.

unicode_literals

Memperkenalkan sintaks literal untuk bytesobjek. Berarti pernyataan seperti itu bytes('Hello world', 'ascii')dapat dengan mudah dinyatakan sebagai b'Hello world'.

generator_stop

Mengganti penggunaan StopIterationpengecualian yang digunakan di dalam fungsi generator dengan RuntimeErrorpengecualian.

Satu kegunaan lain yang tidak disebutkan di atas adalah bahwa __future__pernyataan tersebut juga mengharuskan penggunaan interpreter Python 2.1+ karena menggunakan versi yang lebih lama akan melempar pengecualian runtime.


Referensi

Robert Grossman
sumber
Dengan asumsi Anda sedang offline, bagaimana python mengetahui apakah versi masa depan tersedia atau tidak? Dan bagaimana cara menggunakan fitur masa depan jika Anda belum menginstal versi python di komputer Anda?
Mohsen Haddadi
25

Atau seperti mengatakan "Karena ini adalah python v2.7, gunakan fungsi 'cetak' yang berbeda yang juga telah ditambahkan ke python v2.7, setelah itu ditambahkan dalam python 3. Jadi 'cetak' saya tidak akan lagi menjadi pernyataan (mis. cetak "pesan") tetapi fungsinya (mis. cetak ("pesan", opsi). Dengan begitu ketika kode saya dijalankan dengan python 3, 'cetak' tidak akan rusak. "

Di

from __future__ import print_function

print_function adalah modul yang berisi implementasi baru 'cetak' sesuai dengan perilakunya dalam python v3.

Ini memiliki penjelasan lebih lanjut: http://python3porting.com/noconv.html

Praym
sumber
2

Salah satu kegunaan yang saya temukan sangat berguna adalah print_functiondari __future__modul.

Dalam Python 2.7, saya ingin karakter dari pernyataan cetak yang berbeda dicetak pada baris yang sama tanpa spasi.

Itu bisa dilakukan menggunakan koma (",") di akhir, tetapi juga menambahkan ruang ekstra. Pernyataan di atas bila digunakan sebagai:

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

Ini akan mencetak nilai v_numdari setiap iterasi dalam satu baris tanpa spasi.

Abhi31jeet
sumber
-3

Setelah Python 3.0 dan seterusnya, cetak bukan lagi sekadar pernyataan, melainkan fungsi. dan termasuk dalam PEP 3105.

Juga saya pikir paket Python 3.0 masih memiliki fungsi khusus ini. Mari kita lihat kegunaannya melalui "program Pyramid" tradisional dengan 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:
*
**
***
****

Jika kami menggunakan fungsi cetak normal, kami tidak akan dapat mencapai hasil yang sama, karena print () disertai dengan baris baru tambahan. Jadi setiap kali bagian dalam untuk loop dijalankan, ia akan mencetak * ke baris berikutnya.

vikash gupta
sumber