Python 3.14 ile gelen yeniliklere hızlıca göz attım. Aşağıdaki kodları yerelinizde denemek için uv yükleyin ve REPL’i aşağıdaki komutla çalıştırın:
uv python upgrade 3.14
uvx [email protected]
PEP 750: Template Strings
Template stringleri (kısaca t-strings), hazırda var olan f-strings’teki önemli bir eksikliği gidermek için sunulmuş bir öneriydi ve 3.14 ile birlikte artık kullanıma hazır. Önce problemi göstereyim:
>>> name = "Gökmen"
>>> f_hello = f"Hello, {name}"
>>> t_hello = t"Hello, {name}"
>>> type(f_hello)
<class 'str'>
>>> type(t_hello)
<class 'string.templatelib.Template'>
f_hello
tipi str
olduğu için, artık içinde değişkenler neydi, hangi kısımlar statikti anlamak için ekstra kod yazmak gerekiyordu. ama tip Template
olunca bu bilgilerin hepsine erişim mümkün:
>>> dir(t_hello)
['__add__', '__class__', '__class_getitem__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'interpolations', 'strings', 'values']
>>> t_hello.values
('Gökmen',)
>>> t_hello.strings
('Hello, ', '')
>>> t_hello.interpolations
(Interpolation('Gökmen', 'name', None, ''),)
Buna niye ihtiyaç vardı? Dinamik değerler üzerinde string işlemleri yapmak pratikleşiyor:
>>> from string.templatelib import Interpolation
>>> "".join([part.value.upper() if isinstance(part, Interpolation) else part for part in t_hello])
'Hello, GÖKMEN'
Template
ile basit bir Jinja clone’u bile yapılabilir.
PEP 649, PEP 749: Annotationlarda NameError
Probleminin Kalkması
Aşağıdaki kod Python 3.13’te NameError
hatası veriyor, çünkü X
tanımlı değilken a
tipini tanımlamaya çalışıyoruz:
>>> a: X | None = None
... class X: ...
...
Traceback (most recent call last):
File "<python-input-0>", line 1, in <module>
a: X | None = None
^
NameError: name 'X' is not defined
Bu problemi çözmek için ya X
‘i string yapıyorduk; ya da __future__.annotations
kullanıyorduk. Şimdi artık hiçbirisine gerek yok:
>>> a: X | None = None
... class X: ...
...
>>>
PEP 734: Çoklu Yorumlayıcı Kullanmak İçin Yeni Modül: interpreters
Artık C-API’nın derinliklerinde kaybolmadan, Python kodu içinde kalarak aynı process içinde birden fazla interpreter üzerinden Python kodunu çalıştırmak mümkün hale geldi. Normalde ana interpreter altında başlatacağınız tüm alt interpreterler birbirlerinden izoledirler. Siz aynı Python kodunu 100 tane interpreter’de başlatsanız bile, birbirleriyle iletişim, veri aktarımı olmadığı sürece bunun performansa bir katkısı olmuyordu. Şimdi bu yeni modül, paylaşımlı objeler sayesinde iletişimi mümkün hale getiriyor. Belki bunu daha sonra RAYT‘ı optimize ederek gösterebilirim, şimdilik buradan örnek kodu paylaşıyorum:
import interpreters
from mymodule import load_big_data, check_data
numworkers = 10
control = interpreters.create_queue()
data = memoryview(load_big_data())
def worker():
interp = interpreters.create()
interp.prepare_main(control=control, data=data)
interp.exec("""if True:
from mymodule import edit_data
while True:
token = control.get()
edit_data(data)
control.put(token)
""")
threads = [threading.Thread(target=worker) for _ in range(numworkers)]
for t in threads:
t.start()
token = 'football'
control.put(token)
while True:
control.get()
if not check_data(data):
break
control.put(token)
PEP 758: Çoklu Exceptionlar’da Parantez Kullanmaya Artık Gerek Yok
En çok yaptığım syntax hatalarından biriydi, artık exception’ları parantez kullanmadan yazmak geçerli bir syntax:
>>> try:
... x()
... except NameError, ValueError:
... print("achtung!")
...
achtung!
PEP 765: finally
İçinde return
/break
/continue
Kullanımının Kaldırılması Planı
Geriye uyumluluğun korunması için şimdilik sadece SyntaxWarning
alıyoruz. finally
aslında her koşulda çalıştığı için return
kullanımında epey kafa karıştırıcı oluyordu:
>>> def bool_return():
... try:
... return True
... finally:
... print("you tried to return True but you will also see this message?")
... return False
...
<python-input-3>:6: SyntaxWarning: 'return' in a 'finally' block
>>> bool_return()
you tried to return True but you will also see this message?
False
Bu arada.. REPL iyice metin tabanlı editör haline gelmiş, syntax highlighter güzel çalışıyor.
PEP 768: Breakpoint Eklemeden Debug Edebilme İmkanı
Bu galiba biraz açık kalp ameliyatı gibi; production’da ve production kodunda test ve development sürecine dair herhangi bir kod parçasının repoya commit edilmesine bile izin verilmez. Bunun için genelde Sentry gibi servisler kullanılır ve yapılacak en iyi şey şu anda logging’i efektif kullanmak. Nadir de olsa bazen daha kolay bir debugging olsun arzusunda olabiliyoruz. PEP 768 buna bir alternatif olabilir.
remote_exec
adında fonksiyon bu konuda bize yardımcı oluyor. Bu fonksiyonun birinci parametresi, debug etmek istediğimiz Python process’in PID numarası:
import sys
import uuid
# Execute a print statement in a remote Python process with PID 12345
script = f"/tmp/{uuid.uuid4()}.py"
with open(script, "w") as f:
f.write("print('Hello from remote execution!')")
try:
sys.remote_exec(12345, script)
except Exception as e:
print(f"Failed to execute code: {e}")
Diğer Yenilikler ve Python 3.9
3.13 ile gelen Free-Threaded modu, garbage collection, REPL, standart modüller geliştirildi. Hata mesajları typo’larda öneri sunabiliyor (whillle yazdığınızda “while mi demek istediniz” diyor). Bu arada her yeni major sürümde, bizi bu yeniliklerden alıkoyan en önemli şey de eski sürümlere olan desteğin sürdürülmesi.
Artık Python 3.9 güvenlik güncellemeleri gelmeyecek. Bence projelerimizde 3.9’u desteklemeyi bırakmanın zamanı geldi. Bu sayede:
- Structural Pattern Matching (
match - case
) kullanabileceğiz. Buraya bir göz atın. - Tek
with
ile birden fazla context’i aynı anda yönetmek için parantez kullanabileceğiz. Union[bool, None]
yerinebool | None
gibi pipe kullanımı geçerli olacak.
Python projelerini güncel tutmak için bir rehber arıyorsanız bu yazıma göz atabilirsiniz: