__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ı)
Ekrem TIKAN için bir cevap yazın Cevabı iptal et