__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.
sumber
Jawaban:
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_statement
dalam 2,5, karenawith
kata kunci itu baru dan tidak boleh digunakan sebagai nama variabel lagi. Untuk menggunakanwith
kata kunci Python di Python 2.5 atau lebih, Anda harus menggunakan impor dari atas.Contoh lain adalah
Tanpa
__future__
barang, keduaprint
pernyataan akan dicetak1
.Perbedaan internal adalah bahwa tanpa impor itu,
/
dipetakan ke__div__()
metode, sementara dengan itu,__truediv__()
digunakan. (Bagaimanapun,//
panggilan__floordiv__()
.)Apropos
print
:print
menjadi fungsi dalam 3.x, kehilangan properti khusus sebagai kata kunci. Jadi sebaliknya.sumber
from __future__ import braces
: pprint
sudah 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.)Saat kamu melakukan
Anda sebenarnya tidak menggunakan
import
pernyataan, 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:
Jika Anda benar-benar ingin mengimpor
__future__
modul, lakukan sajadan kemudian mengaksesnya seperti biasa.
sumber
from __future__ import print_function
keduanya mengubah perilakuprint
kata kunci dan memiliki dampak runtime yang setara denganprint_function = __import__("__future__").print_function
__future__
adalah pseudo-module yang dapat digunakan programmer untuk mengaktifkan fitur bahasa baru yang tidak kompatibel dengan penerjemah saat ini . Misalnya, ekspresi yang11/4
sedang dievaluasi untuk2
. Jika modul yang dijalankan telah mengaktifkan pembagian yang benar dengan mengeksekusi:from __future__ import division
ekspresi
11/4
akan dievaluasi menjadi2.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:sumber
import __future__ xyz
itu no-op?Ini dapat digunakan untuk menggunakan fitur yang akan muncul di versi yang lebih baru sambil memiliki rilis Python yang lebih lama.
Sebagai contoh
akan memungkinkan Anda untuk digunakan
print
sebagai fungsi:sumber
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 :
The
from __future__ import nested_scopes
direktif 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:
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 olehx//y
.The
from __future__ import division
pasukan arahan penggunaan Python 3.0 divisi gaya.absolute_import
Mengizinkan kurung melampirkan banyak
import
pernyataan. Sebagai contoh:Dari pada:
Atau:
with_statement
Menambahkan pernyataan
with
sebagai kata kunci dalam Python untuk menghilangkan kebutuhan akantry/finally
pernyataan. Penggunaan umum ini adalah ketika melakukan file I / O seperti:print_function
:Memaksa penggunaan
print()
panggilan fungsi gaya kurung Python 3 alih-alihprint MESSAGE
pernyataan gaya.unicode_literals
Memperkenalkan sintaks literal untuk
bytes
objek. Berarti pernyataan seperti itubytes('Hello world', 'ascii')
dapat dengan mudah dinyatakan sebagaib'Hello world'
.generator_stop
Mengganti penggunaan
StopIteration
pengecualian yang digunakan di dalam fungsi generator denganRuntimeError
pengecualian.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
sumber
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
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
sumber
Salah satu kegunaan yang saya temukan sangat berguna adalah
print_function
dari__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:
Ini akan mencetak nilai
v_num
dari setiap iterasi dalam satu baris tanpa spasi.sumber
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:
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.
sumber