Python’da __future__ ne için kullanılır ve nasıl çalışır?

__future__ Python modüllerinde sık sık görünür.

__future__ Python modüllerinde sık sık görünür. Ancak Python belgelerinde __future__ açıklamasını okuduktan sonra bile neyin ne için ve nasıl kullanılacağını anlamak pek mümkün olmayabilir. 

Burada en kafa karıştırıcı kavram, mevcut bir python sürümünün gelecekteki sürümler için bir özelliği nasıl içerdiği ve gelecekteki bir sürümdeki bir özelliği kullanan bir programın python’un mevcut sürümünde nasıl başarıyla derlenebileceğidir.

Mevcut sürümün gelecek için potansiyel özelliklerle paketlenmiş olduğunu tahmin edebiliriz. Ancak sadece bu bilgi __future__‘un nasıl çalıştığına dair yeterli olmuyor.

Bunu örneklerle açıklamaya çalışalım.


Basitçe söylemek gerekirse, __future__ deyimi Python yorumlayıcılarını dilin daha yeni özelliklerini kullanmaya zorlar. Ama önce future’ın teknik detaylarına bakalım:

Aşağıdakini yaptığımızda

from __future__ import birseyler

aslında bir import ifadesini değil, bir future ifadesi kullanıyoruz. Bu bağlamda Python belgelerini yanlış okumuş oluyoruz, çünkü aslında bu modülü içe aktarmıyoruz.

future ifadeleri özeldir — Python modülünüzün okunma şeklini değiştirir, bu yüzden de dosyanın en üstünde olmaları gerekir. Dosyanızdaki kelimelere veya sembollere yeni veya farklı anlamlar verirler. Belgelerden:

future deyimi, belirli bir modülün python’un gelecekteki belirli bir sürümünde kullanılabilir olacak sözdizimi veya anlambilim kullanılarak derlenmesi gerektiğini derleyiciye söyleyen bir yönergedir. Gelecekteki ifade, python’un dilde uyumsuz değişiklikler getiren gelecekteki sürümlerine geçişi kolaylaştırmak için tasarlanmıştır.

Bu modülü gerçekten içe aktarmak istiyorsak sadece

import __future__

yazarız ve sonra her zamanki gibi çalıştırırız.

Peki bu ne anlama geliyor?

__future__ programcıların mevcut yorumlayıcıyla uyumlu olmayan yeni dil özelliklerini etkinleştirmek için kullanabileceği sahte bir modüldür. Örneğin, 11/4 ifadesi şu anda 2 olarak değerlendiriliyor. Ancak, yürütüldüğü modül, aşağıdakileri yürüterek gerçek bölmeyi etkinleştirmişse:

from __future__ import division

11/4 ifadesi 2.75 olarak değerlendirilecek. __future__ modülünü içe aktararak ve değişkenlerini değerlendirerek, dile ilk olarak ne zaman yeni bir özellik eklendiğini ve ne zaman varsayılan olacağını görebilirsiniz:

>>> from __future__ import division
>>> division
_Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 131072)

Bunun çıktısı aşağıdaki gibi olacaktır:

(
 PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int
 PY_MINOR_VERSION, # the 1; an int
 PY_MICRO_VERSION, # the 0; an int
 PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string
 PY_RELEASE_SERIAL # the 3; an int
)

Örneğin yararlı olabilecek kullanımlardan biri print_function‘dır.

Python 2.7’de, farklı print deyimlerindeki karakterlerin aynı satırda ve sonlarında boşluk olmadan yazdırılmalarını isteyelim:

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

Bu, her yinelemeden gelen v_num değerini boşluksuz tek bir satırda yazdırır.


Peki __future__ deyimi şu anda neyi destekliyor?


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

nested_scopes

Python 2.1’den önce, aşağıdaki kod bir NameError’u verir:

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

from __future__ import nested_scopes ifadesi ise bu özelliğin etkinleştirilmesine izin verir.

üreteçler

Ardışık işlev çağrıları arasında durumu kaydetmek için aşağıdaki gibi üreteç kullanılabilir:

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

division

Klasik bölme Python 2.x sürümlerinde kullanılır. Yani bazı bölüm ifadeleri bölünmenin makul bir yaklaşık değerini döndürürken (“gerçek bölünme”) diğerleri ondalıklı sonuç geri döndürür. Python 3.0’dan başlayarak, gerçek bölme x/y tarafından belirtilirken, ondalıklı bölme x//y ile belirtilir.

from __future__ import division ifadesi Python 3.0 stiline kullanımı zorlar.

absolute_import

Parantez ile birden çok import deyiminin alınmasına izin verir. Mesela:

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

yerine:

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

yapabiliriz.

with_statement

try/finally deyimlerine olan ihtiyacı ortadan kaldırmak için with deyimini Python’da anahtar sözcük olarak ekler. Bunun yaygın kullanım alanları, aşağıdaki gibi dosya okuma işlemleri olabilir:

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

print_function:

print MESSAGE deyimi yerine Python 3 parantez stili print() işlev çağrısının kullanımını zorlar.

generator_stop

Özel durumlar dışında üreteç işlevleri içinde kullanılan StopIteration özel durumunun kullanımını RuntimeError ile değiştirir.

Yukarıda belirtilmeyen diğer bir kullanım, eski bir sürümün kullanılması bir çalışma zamanı özel durumu atacağından, __future__ deyimin Python 2.1+ yorumlayıcılarının kullanılmasını da gerektirmesidir.


Kaynaklar

Yukarıdaki bilgilere ilaveten, aşağıdaki kaynaklar da faydalı olacaktır:

Bu yazı topluluk tarafından oluşturuldu. Lisans bilgisine bakabilirsiniz. Yanlış veya eksik bilgileri düzenlemek için github üzerinden katkıda bulunabilirsiniz.

Kategoriler: Yazı, Python

Okumaya devam et!

Python’da dosya oluşturma ve değiştirme tarihi/saati nasıl öğrenilir?

Platformlar arası dosya oluşturma ve değişiklik tarihlerini almanın en iyi yolu Python‘da nedir? Platformlar arası değişiklik tarihi almak kolaydır – os.

Python projesinden yürütülebilir bir exe dosyası nasıl oluşturulur?

Python projemizi tamamladık ve bu projeden tek bir yürütülebilir dosya oluşturmak istiyoruz.

Python’da metaclass nedir?

Obje olarak Class metaclass’ları anlamadan önce, Pythondaki class’ı tamamıyla anlamamız gerekir.

Pip kullanarak harici modüllerin kurulması

pip python paket indeksinde (PyPI) bulunan çok sayıda seçenek arasından herhangi bir paketi yüklemeniz gerektiğinde başvurabileceğiniz yardımcınızdır.

Yorum Gönderin

E-posta hesabınız yayımlanmayacak.

koddla
Tema Mundana by WowThemes.net.