Mart ayında 3.9 sürümü yayınlanan Python programlama dilinin, bugün itibariyle 3.9.0b4 sürümü yayınlandı. Yakın zamanda tam sürümün yayınlanılması planlanmaktadır. Peki, bu sürümün diğer sürümlerden farkı nedir? Ne tür değişiklikler söz konusu? Yeni özelliklerden bazıları inanılmaz derecede heyecan verici ve sürüm yayınlandıktan sonra kullanıldıklarını görmek oldukça şaşırtıcı olacak. Python 3.9 sürümünün yeni özellikleri 4 başlık altında toplanılabilir:
- Sözlük Birleştirme İşlemleri
- Değişken Türü İpucu
- İki Yeni String Yöntemi
- Yeni Python Ayrıştırıcısı
Şimdi bu yeni değişikliklerin nasıl kullanıldıklarına bakalım.
İçindekiler
Sözlük Birleştirme İşlemleri
Şık söz dizimi ile en sevilen özelliklerden biri olmuştur. A ve B olarak birleştirmeniz gereken iki sözlük var ise, bu sözlükleri birleştirmek için “birleşme” işaretini kullanıyoruz.
Birleşme işareti, ” | ” dir.
a = {1: 'a', 2: 'b', 3: 'c'} b = {4: 'd', 5: 'e'} c = a | b print(c) #Beklenen çıktı: [Out] : {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}
Ve sözlüğü güncelleyen güncelleme operatörü, ” |= “
a = {1: 'a', 2: 'b', 3: 'c'} b = {4: 'd', 5: 'e'} a |= b print(a) #Beklenen Çıktı: [Out]: {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}
Eğer sözlüklerin ikisinde ortak bir anahtar varsa, ikinci sözlükte anahtar kullanılır:
a = {1: 'a', 2: 'b', 3: 'c', 6: 'ortak'} b = {4: 'd', 5: 'e', 6: 'ama farklı'} print(a | b) #Beklenen Çıktı: [Out]: {1: 'a', 2: 'b', 3: 'c', 6: 'ama farklı', 4: 'd', 5: 'e'}
“|=” operatörünün başka bir güzel özelliği de bir liste veya jeneratör gibi nesneler kullanarak sözlüğü yeni key (anahtar)/ value (değer) çiftleriyle güncelleyebilmesidir:
a = {'a': 'one', 'b': 'two'} b = ((i, i**2) for i in range(3)) a |= b print(a) #Beklenen Çıktı: [Out]: {'a': 'one', 'b': 'two', 0: 0, 1: 1, 2: 4}
Aynı işlemi standart “|” işareti ile denersek, TypeError hatası alırız, çünkü “|” operatörü sadece sözlükler arasında işlem yapmamıza izin verir.
Değişken Türü İpucu
Python dinamik olarak yazılmıştır, yani kodumuzda veri türlerini belirtmemize gerek yoktur.
Bu çoğu zaman iyi ama bazen kafa karıştırıcı olabiliyor, Python’un bu kadar esnek olması bazı sıkıntılara sebep olabilmektedir.
3.5 sürümünden sonra bu veri türlerini belirleyebildik, ama oldukça hantaldı. Bu güncelleme ile bu gerçekten değişti, bir örnek kullanalım:
add_int fonksiyonumuzda, bir sayıyı kendisiyle toplamak istiyoruz. Ama editör bunu bilmiyor ve “+” işaretini kullanarak iki dizeyi birbirine herhangi bir uyarı vermeden ekleyebiliyor.
Ancak, biz fonksiyonu tanımlarken değişkeni tipini int olarak belirtirsek, fonksiyona parametre olarak string değer verdiğimizde bize uyarı verecektir. Çünkü fonksiyonun bizden beklediği parametre olarak int değer girilmesidir. Editör bu durumu kolayca fark edebiliyor.
Bir başka örnek verecek olursak,
sum_dict fonksiyonumuz, parametre olarak bir sözlük almaktadır. Fakat spesifik olarak belirtilen bir şey vardır, o da sözlüğün anahtarlarının bir String, değerlerinin ise bir int olmasıdır.
Bu fonksiyonu test etmek istediğimizde, ilk test değişkeninde herhangi bir sıkıntı yoktur. Çünkü fonksiyonun gereksinimlerini karşılamaktadır. Ancak test2 sözlüğüne baktığımız zaman anahtar ve değerlerinin int olduğunu görebiliyoruz. Editör bu durumda bize bir uyarı vermektedir.
Görüldüğü üzere, değişken türü ipucu özelliği her yerde kullanılabilir ve yeni söz dizimi sayesinde, artık daha anlaşılır gözükmektedir.
String Yöntemleri
Diğer özellikler gibi görkemli olmasa da, yine de bahsedilmeye değer. Ön ekleri ve son ekleri kaldırmak için iki yeni dize yöntemi eklendi:
"Merhaba dünya".removeprefix("Me") #Beklenen çıktı: [Out]: "rhaba dünya" "Merhaba dünya".removesuffix("ya") #Beklenen çıktı: [Out]: "merhaba dün"
Yeni Ayrıştırıcı
Bu, gözden uzak bir değişikliktir, ancak Python programlama dilinin gelecekteki evrimi için en önemli değişiklerden biri olma potansiyeline sahiptir.
Python şu anda ağırlıklı olarak LL(1) tabanlı bir dil bilgisi kullanıyor. Kullanılan bu yöntemin kullanımı nedeniyle Python’da bazı sorunlara yol açıyor.
- Python LL olmayan(1) dil bilgisi içerir; Bu nedenle, geçerli dil bilgisinin bazı bölümleri geçici çözümler kullanılır ve gereksiz karmaşıklık oluşturur.
- LL(1) Python söz diziminde sınırlamalar yaratır. Bu sorun, aşağıdaki kodun yalnızca geçerli ayrıştırıcı (SyntaxError( kullanılarak uygulanamayacağını vurgular:
with (open("a_really_long_foo") as foo, open("a_really_long_bar") as bar): pass
LL(1) ayrıştırıcı da sol öz yineleme ile bozuluyor. Belirli öz yinelemeli söz dizimi, ayrıştırma ağacında sonsuz bir döngüye neden olabilir. Python’un yaratıcısı Guido van Rossum bunu burada açıklıyor.
PEG tabanlı yeni ayrıştırıcı, Python geliştiricilerine önemli ölçüde daha fazla esneklik sağlayacak – Python 3.10’dan itibaren fark etmeye başlayacağımız bir şey.
Python 3.9 sürümünün yeni özellikleri özellikleri bu şekildedir. Gelişmeleri yakından takip etmek isterseniz, Python dilinin resmi dokümantasyonunu inceleyebilirsiniz.