__future__
modülü eski versiyonda yazılmış Python kodu içerisinde yeni versiyon özelliklerini kullanmanızı sağlayan bir modüldür. Yani mesela kullandığınız özelliğin yeni versiyonda başka bir işlevi olsun, __future__
modülünü kullanarak mevcut Python versiyonundaki özelliği değil de daha yeni versiyondaki özelliği kullanmasını söylersiniz.
Başka bir deyişle, __future__
modülü ile derleyiciye dersiniz ki; mevcut versiyondaki davranışları sergilemek yerine Python’ın standardı haline gelmiş ileri versiyondaki davranışları sergile.
Örnekler
Bölme işlemi (from __future__ import division)
Bölme işlemi sonucu Python 2.x versiyonlarında int
dönüyor. Python 3.x versiyonlarında ise float
dönüyor. Görelim:
Python 2.x
Python 2.7.17 (default, Nov 7 2019, 10:07:09)
[GCC 7.4.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 9/4
2
Python 3.x
Python 3.6.9 (default, Nov 7 2019, 10:44:02)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 9/4
2.25
Bu noktada varsayılan bölme işleminin Python 2.x içerisinde Python 3.x’deki davranması için from __future__ import division
kodunu ekliyoruz:
Python 2.7.17 (default, Nov 7 2019, 10:07:09)
[GCC 7.4.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 9/4
2
>>> from __future__ import division
>>> 9/4
2.25
Diğer bir örnek: print (from __future__ import print_function)
Herhalde Python 2.x ile 3.x geçişinde en yaygın karşılaşılan farklılıklardan birisi print
olmuştur.
print
Python 2.x’de sadece özel bir anahtar kelime iken Python 3.x’de fonksiyona dönüşüyor. Görelim:
Python 2.7.17 (default, Nov 7 2019, 10:07:09)
[GCC 7.4.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print
>>> from __future__ import print_function
>>> print
<built-in function print>
Daha ne örnekler var?
__future__
modülü ile uygulayabileceğiniz tüm özellikleri aşağıdaki tabloda bulabilirsiniz. feature satırında geçen özellikler optional in satırında belirten Python sürümünde isteğe bağlı olarak geliyor. mandatory in satırında ise artık varsayılan özellik olarak geliyor. effect satırında ise bu özelliklerin “neden” değiştiği ile ilgili kapsamlıca bilgi bulabilirsiniz.
feature | optional in | mandatory in | effect |
---|---|---|---|
nested_scopes | 2.1.0b1 | 2.2 | PEP 227: Statically Nested Scopes |
generators | 2.2.0a1 | 2.3 | PEP 255: Simple Generators |
division | 2.2.0a2 | 3.0 | PEP 238: Changing the Division Operator |
absolute_import | 2.5.0a1 | 3.0 | PEP 328: Imports: Multi-Line and Absolute/Relative |
with_statement | 2.5.0a1 | 2.6 | PEP 343: The “with” Statement |
print_function | 2.6.0a2 | 3.0 | PEP 3105: Make print a function |
unicode_literals | 2.6.0a2 | 3.0 | PEP 3112: Bytes literals in Python 3000 |
generator_stop | 3.5.0b1 | 3.7 | PEP 479: StopIteration handling inside generators |
annotations | 3.7.0b1 | 4.0 | PEP 563: Postponed evaluation of annotations |
Bitirirken
__future__
modülünün en çok nerede işe yarayacağı ile ilgili benim aklıma gelen örnek senaryo şu: Python 2.x’de yazılmış bir koda ekleme yapmanız gerekiyor ve bu kodu gelecekte Python 3.x’e geçirmeyi planlıyorsanız. Bu durumda hazırdaki Python 2.x koduna yeni yapacağınız eklemeleri ileride tekrar Python 3.x’e çevirmekle uğraşmamak için __future__
modülü ile şimdiden Python 2.x içerisinde Python 3.x yazar gibi yazmaya başlayabiliyorsunuz.
Son
Stackoverflow yorumlarının bir tanesinde geleceğe dönüş filmine atıfta bulunulmuş. Back to the __future__ 🙂
Kaynaklar:
- https://stackoverflow.com/questions/7075082/what-is-future-in-python-used-for-and-how-when-to-use-it-and-how-it-works (konuyu anlamakta ve yukarıdaki tanımları oluştururken yararlandım)
- https://www.python.org/dev/peps/pep-0236/ (__future__ modülünün kullanımı alınması ile ilgili detaylı açıklama)
- https://docs.python.org/3/library/__future__.html (modül ile ilgili Python resmi dokümantasyon sayfası)
İşime yaradı teşekkürler 🙂
Teşekkür ederiz,emeğine saglık
Çok sade bir dille anlatmışsın teşekkürler.
Teşekkürler Görkem 🙂