Python 3.12’ye Göç

Ecommerc.io olarak Python’u sıkça kullanıyoruz. Projelerimize başladığımızda Python 3.10 sürümü ile başladık ancak bu sürüm artık eskimeye yüz tuttu.

Python 3.12 Ekim 2023 tarihinde yayınlanmış ve sürüm üzerinden 1 yıl geçmiş. Typing modülü dahil birçok yeni özellik ve performans iyileştirmeleri içeriyor. Bu blog girdisinde kullandığımız teknolojilerle birlikte Python 3.10’dan 3.12’ye nasıl geçtiğimize değineceğim.

Pydantic

Pydantic Python ekosisteminde en çok kullanılan veri doğrulama kütüphanesi. Biz bu kütüphaneyi JSON doğrulamak ve JSON objelerini Python objelerine çevirmek için kullanıyoruz. Bu bize JSON objelerine tip atamamıza ve kodumuzu daha okunabilir hale getirmemize olanak sağlıyor.

Python 3.10 kullanırken 1.x sürümünü kullandık ancak sonrasında 2.x sürümü geriye uyumlu olmadan güncellendi. Dolayısıyla öncelikle pydantic sürümünü güncellememiz gerekti.

model_validate()

Bizi ilgilendiren en büyük değişiklik .parse_obj() yerine artık .model_validate() kullanılıyor olması. Modellerimizi tanımladıktan sonra parse_obj() çağrıları yerine model_validate() kullandığınızda kodunuzun büyük bir kısmını yeni pydantic sürümüne geçirmiş oluyorsunuz.

model_dump()

Modelleri dictionary olarak almak için öncesinde dict() kullanırken, bu çağrı artık model_dump() olmuş durumda.

validate_python()

Herhangi bir Python objesini parse etmek için kullanılan çağrı. 2.x ile beraber parse_obj_as çağrısı yerine TypeAdapter kullanmamız gerekmekte. Örnek olarak elimizdeki datayı List[Stock] tipinde parse etmek istersek aşağıdaki kod bloğunu kullanmamız gerekiyor.

from pydantic import TypeAdapter

adapter = TypeAdapter(List[Stock])
result = adapter.validate_python(data)

Sayıların Metin Haline Çevrimi

2.x ile birlikte ön tanımlı olarak bu özellik kapatılmış durumda. Elinizde bir API varsa ve buradan gelen sayı değerini string halinde görmek istiyorsanız bu ayarı açmanız gerekiyor. Bunun için model konfigürasyonuna aşağıdaki satırı eklemeniz yeterli olacaktır.

model_config = ConfigDict(coerce_numbers_to_str=True)

Daha Fazlası

Pydantic 2.x sürümü yeniden yazılmış bir sürüm ve geriye uyumlu değil. Kod üzerinde gerekli değişikliklerin yeni kütüphaneye uyumlu şekilde yazılması gerekiyor ve bahsettiğimiz değişiklikler yukarıda yazılanlarla sınırlı değil. 1.x sürümünden 2.x sürümüne geçiş için pydantic’in geçiş belgesine göz atmanızı öneririm.

Celery

Bu yazının yazıldığı tarih itibariyle en son sürüm olan 5.4.0 sürümüne güncelledik. Bu sürüm Python 3.12 değişikliklerini de içeriyor. Celery koduna herhangi bir müdahalede bulunmadan geçişi gerçekleştirebildik.

Python 3.12

Bu sürüm type sistemi, f-string gibi birçok alanda değişiklikler içeriyor. Maalesef teker teker ne kadar değişiklik olduğunu bu blog girdisinde açıklayamayacağım ama aşağıdaki video güzel bir özet vermiş, izleyebilirsiniz.

Ubuntu 22.04

Ubuntu resmi repolarındaki Python sürümü 3.10. Geçiş yapmak için öncelikle Ubuntu içerisine Python 3.12 yüklememiz gerekti. Bunu deadsnakes reposundan sağladık.

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt install python3.12 python3.12-venv

Devamında uygulamalarımız için oluşturduğumuz .venv dizinini yeniden oluşturmamız ve pip ile bağımlılıkları yüklememiz gerekti.

python3.12 -m venv venv
source venv/bin/activate

pip install -r requirements.txt

Sonrasında supervisor ile yönettiğimiz servileri yeniden başlattık ve Python 3.12 geçişini tamamlamış olduk.

Sonuç

Python 3.12 birçok yenilik ve performans optimizasyonu ile birlikte geliyor. 3.12 güncellemesi ile birlikte bunları kullanabilme imkanı edindik. Yeni type güncellemeleri ile kodumuz daha sade ve anlaşılır oldu. İşlemci ve bellek kullanımı konusunda bir iyileşme gözlemlemedik, Python 3.10 nasıl davranıyorsa Python 3.12 de aynı şekilde davranmaya devam etti.

Genel olarak 3.12 sürümünden memnun kaldık diyebiliriz. Geçiş aşamasında kullandığımız kütüphaneleri güncellemeye zorlaması iyi bile oldu denebilir.

Eren Türkay
Eren Türkay