Python'da __future__ nedir ve nasıl / ne zaman kullanılacağı ve nasıl çalıştığı


694

__future__Python modüllerinde sıklıkla görülür. Python'un belgesini__future__ okuduktan sonra bile ne için ve nasıl / ne zaman kullanılacağını anlamıyorum .__future__

Herkes örneklerle açıklayabilir mi?

__future__Aldığım temel kullanımla ilgili birkaç cevap doğru görünüyordu.

Ancak, nasıl __future__çalıştığı ile ilgili bir şey daha anlamam gerekiyor :

Benim için en kafa karıştırıcı konsept, mevcut bir python sürümünün gelecekteki sürümler için özellikleri nasıl içerdiği ve gelecekteki bir sürümden bir özelliği kullanan bir programın Python'un mevcut sürümünde nasıl başarılı bir şekilde derlenebileceğidir.

Mevcut sürümün gelecek için potansiyel özelliklerle paketlendiğini tahmin ediyorum. Ancak, özellikler yalnızca __future__geçerli standart olmadığı için kullanılabilir . Haklıysam bana haber ver.


10
Bu, gelecekteki beyan için orijinal tekliftir. İlk etapta neden orada olduğunu anlamada yardımcı oldum ve bu yüzden ne zaman ve nasıl kullanılacağı doğal olarak takip ediliyor. python.org/dev/peps/pep-0236
Jpaji Rajnish


3
Gelecekteki bir ifade, derleyiciye belirli bir modülün Python'un belirli bir gelecek sürümünde kullanılabilecek sözdizimi veya anlambilim kullanılarak derlenmesi gerektiğine dair bir yönergedir. Gelecekteki ifade, Python'un dilde uyumsuz değişiklikler getiren gelecekteki sürümlerine geçişi kolaylaştırmayı amaçlamaktadır. Özelliğin standart haline gelmesinden önce yeni özelliklerin modül başına kullanılmasına izin verir.
18:11, shivam13juna

Yanıtlar:


384

İle __future__modülün dahil, yavaş yavaş uyumsuz değişikliklere veya yeni anahtar kelimeler tanıtan böyle olanlar alışık edilebilir.

Örneğin, içerik yöneticilerini kullanmak için from __future__ import with_statement, withanahtar kelime yeni olduğu ve artık değişken adı olarak kullanılmaması gerektiği için 2.5'te yapmanız gerekiyordu . Kullanabilmek için withPython 2.5 veya daha büyük bir Python anahtar kelime olarak, yukarıdan ithalat kullanmanız gerekecektir.

Başka bir örnek

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

Bu __future__şeyler olmadan , her iki printifade de yazdırılır 1.

İç fark, bu içe aktarma olmadan /, __div__()yöntemle birlikte iken , yöntemle eşleştirilmesidir __truediv__(). (Her durumda, //arar __floordiv__().)

Apropos print: print3.x'te bir işlev haline gelir ve anahtar kelime olarak özel özelliğini kaybeder. Yani tam tersi.

>>> print

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

151
unutmayın from __future__ import braces: p
mdeous

13
Daha bir sekme adam ise @zoogleflatt, sen kuvvetle tavsiye edilir PEP 8. bilmiyorum değil sekmeleri kullanın ...
glglgl

5
@glglgl Teknik olarak sadece tercih edildiklerini söylüyor. Neden bu tam olarak okuduktan sonra benim için tamamen açık değildi, ben kod girdap yapmak için tam olarak girinti seviyeleri maç sanırım?
Jpaji Rajnish

4
@zoogleflatt Ayrıca, çoğu insanın 1 girinti seviyesi için 4 boşluk kullanması, uyumluluk nedenlerinden dolayı bir sekmenin 8 boşluğa eşit olması ve sekmeleri ve boşlukları karıştırmaktan vazgeçilmesi ile ilgilidir (sırasıyla, AFAIK, hatta izin verilmiyor) Py3)
glglgl

1
@whiteSkar Şu anda python 3'ün yeni sürümleriyle güncel değilim, ancak hala kullanımda olduğunu varsayıyorum, muhtemelen bu oldukça eski özelliklerle ihtiyacınız yok. Python 3'te printkesinlikle bir işlevdir, ancak kullanabileceğiniz başka özellikler de olabilir __future__. (Düzenleme: bkz. Docs.python.org/3/library/__future__.html hala kullanılıyor.)
glglgl

195

Ne zaman yaparsın

from __future__ import whatever

Aslında bir importifade değil, gelecekteki bir ifade kullanıyorsunuz . O modülü içe aktarmadığınız için yanlış dokümanları okuyorsunuz.

Gelecekteki ifadeler özeldir - Python modülünüzün ayrıştırılma şeklini değiştirirler, bu yüzden dosyanın üstünde olmalıdırlar . Dosyanızdaki kelimelere veya simgelere yeni veya farklı bir anlam verir. Dokümanlardan:

Gelecekteki bir ifade, derleyiciye belirli bir modülün Python'un belirli bir gelecek sürümünde kullanılabilecek sözdizimi veya anlambilim kullanılarak derlenmesi gerektiği yönergesidir. Gelecekteki ifade, Python'un dilde uyumsuz değişiklikler getiren gelecekteki sürümlerine geçişi kolaylaştırmayı amaçlamaktadır. Özelliğin standart haline gelmesinden önce yeni özelliklerin modül başına kullanılmasına izin verir.

__future__Modülü gerçekten içe aktarmak istiyorsanız ,

import __future__

ve her zamanki gibi erişebilirsiniz.


4
Teknik olarak, ilgili ad yerel bir değişkene bağlı olduğu için aynı zamanda bir ithalat ifadesidir. from __future__ import print_functionher ikisi de printanahtar kelimenin davranışını değiştirir ve çalışma zamanı print_function = __import__("__future__").print_function
efektine

112

__future__ , programcıların geçerli yorumlayıcıyla uyumlu olmayan yeni dil özelliklerini etkinleştirmek için kullanabileceği sözde bir modüldür . Örneğin, ifade 11/4şu anda olarak değerlendirilir 2. İçinde çalıştırıldığı modül gerçekleştirerek gerçek bölünmeyi etkinleştirmişse:

from __future__ import division

ifadesi 11/4değerlendirir 2.75. __future__Modülü içe aktararak ve değişkenlerini değerlendirerek, dile yeni bir özelliğin ne zaman eklendiğini ve varsayılan olacağı zamanı görebilirsiniz:

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

1
Yani, değişkenlerdeki yayın sürümüne bağlı olarak, yorumcunuz belirtilenden daha yeni bir sürüm kullanıyorsa, import __future__ xyzno-op?
Ray

4
Tarayıcı dünyasındaki bir
çoklu dolguyla

47

Python'un daha eski bir sürümüne sahipken daha yeni sürümlerde görünecek özellikleri kullanmak için kullanılabilir.

Örneğin

>>> from __future__ import print_function

printbir işlev olarak kullanmanıza izin verir :

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

29

Zaten bazı harika cevaplar var, ancak hiçbiri __future__ifadenin şu anda desteklediğinin tam bir listesini ele almıyor.

Basitçe ifade etmek gerekirse , __future__ifade Python tercümanlarını dilin daha yeni özelliklerini kullanmaya zorlar.


Şu anda desteklediği özellikler şunlardır:

nested_scopes

Python 2.1'den önce, aşağıdaki kod bir NameError değerini yükseltir :

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

from __future__ import nested_scopesBu özellik için izin verecektir yönerge etkin olması.

generators

Ardışık işlev çağrıları arasındaki durumu kaydetmek için aşağıdakine benzer jeneratör işlevleri tanıtıldı:

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

division

Klasik bölüm Python 2.x sürümlerinde kullanılır. Diğer bir deyişle, bazı bölme ifadeleri makul bir bölme yaklaşımı ("gerçek bölme") ve bazılarının da zemine ("kat bölme") geri döndüğü anlamına gelir. Python 3.0'dan başlayarak, gerçek bölme ile belirlenirken x/y, kat bölme ile belirtilir x//y.

from __future__ import divisionYönerge kuvvetler Python 3.0 tarzı bölünme kullanımı.

absolute_import

Parantezin birden fazla importifade içermesine izin verir . Örneğin:

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

Onun yerine:

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

Veya:

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

with_statement

İfadeler withihtiyacını ortadan kaldırmak için try/finallyifadeyi Python'da anahtar sözcük olarak ekler . Bunun yaygın kullanımları, dosya G / Ç işlemi gibi:

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

print_function:

Stil ifadesi print()yerine Python 3 parantez stili işlev çağrısının kullanılmasını print MESSAGEzorlar.

unicode_literals

bytesNesnenin gerçek sözdizimini sunar . Yani gibi ifadeler bytes('Hello world', 'ascii')basitçe ifade edilebilir b'Hello world'.

generator_stop

StopIterationÜretici işlevlerinde kullanılan kural dışı durumun kullanımını kural dışı durumla değiştirir RuntimeError.

Yukarıda belirtilmeyen bir başka kullanım __future__da, daha eski bir sürümü kullanmak bir çalışma zamanı istisnası atacağından , ifadenin Python 2.1+ yorumlayıcılarının kullanılmasını gerektirmesidir.


Referanslar


Çevrimdışı olduğunuzu varsayarsak, python gelecekteki bir sürümün mevcut olup olmadığını nasıl bilebilir? Python'un gelecekteki sürümünü bilgisayarınıza yüklemediyseniz gelecekteki özellikleri nasıl kullanır?
Mohsen Haddadi

25

Veya "Bu python v2.7 olduğundan, python 3'e eklendikten sonra python v2.7'ye eklenmiş olan farklı 'baskı' işlevini kullanın. (örn. "ileti" yazdır), ancak işlevler (ör. yazdır ("ileti", seçenekler). Bu şekilde kodum python 3'te çalıştırıldığında "yazdır" kesilmez. "

İçinde

from __future__ import print_function

print_function, python v3'te nasıl davrandığına göre yeni 'print' uygulamasını içeren modüldür.

Bunun daha fazla açıklaması var: http://python3porting.com/noconv.html


2

Ben çok yararlı olduğu tespit kullanımlarından biri olduğunu print_functiongelen __future__modül.

Python 2.7'de, farklı baskı ifadelerinden gelen karakterlerin boşluk olmadan aynı satıra yazdırılmasını istedim.

Sonunda virgül (",") kullanılarak yapılabilir, ancak fazladan bir boşluk ekler. Yukarıdaki ifade şu şekilde kullanıldığında:

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

Bu, v_numher yinelemenin değerini boşluk bırakmadan tek bir satıra yazdırır .


-4

Python 3.0'dan sonra baskı artık sadece bir ifade değil, onun yerine bir işlev. ve PEP 3105'e dahil edilmiştir.

Ayrıca Python 3.0 paketinin hala bu özel işlevlere sahip olduğunu düşünüyorum. Kullanılabilirliğini Python'daki geleneksel bir “Piramit programı” ile görelim:

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:
*
**
***
****

Normal yazdırma işlevini kullanırsak, print () ek bir satırsonu ile birlikte geldiğinden aynı çıktıyı elde edemeyiz. Bu nedenle, döngü için her iç yürütme işleminde, sonraki satıra * yazdırılır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.