5 puan yazan GN⁺ 2024-10-14 | 2 yorum | WhatsApp'ta paylaş
  • TypedDict, PEP-589'da tanıtıldı ve Python 3.8'e eklendi. Başlıca sözlükler için tip anotasyonları oluşturmakta kullanılır.
  • dataclass veya pydantic kullanarak 'record' tipi veriyi ifade etmek yerine, TypedDict sözlük esnekliğinden yararlanarak alanların eksik olabildiği durumlarda avantaj sağlar.
  • Örneğin, Movie sınıfını tanımlayıp movie değişkenine Movie tipinde bir sözlük atama yöntemi
class Movie(TypedDict):  
    title: str  
  
  
movie: Movie = {"title": "Avatar"}  

Non-totality

  • TypedDict, alanların eksik olabileceğini gösteren non-totality kavramını destekler. HTTP PATCH endpoint'leri uygulanırken kullanışlıdır.
  • dataclass içinde alan eksikliği kavramı olmadığından bu kullanım garip kalabilir.
  • TypedDict içinde total=False ayarıyla alan eksikliğini esnek biçimde ele almak mümkündür.
  • PEP-655, tek tek alanları Required ve NotRequired ile işaretlemeyi mümkün kılar.

TypedDict'i **kwargs olarak kullanmak

  • PEP-692, TypedDict kullanarak değişken anahtar sözcüklü argümanların girişini mümkün kılar.
  • TypedDict kullanımı kodu biraz ayrıntılı gösterebilir, ancak birden fazla fonksiyon tanımında yeniden kullanılabildiğinde faydalıdır.
  • Non-totality ile birlikte kullanıldığında gücü daha da belirginleşir.
    • pytest.fixture'ı özelleştirirken bazı argümanları olduğu gibi aktarma senaryoları gibi
  • Benzer davranış sentinel değerlerle de kurulabilir, ancak tip anotasyonları garipleşebilir.

Bağımlılık enjeksiyonunda TypedDict kullanımı

  • PEP-692, TypedDict kullanılan fonksiyon çağrılarında tip denetimini mümkün kılar.
  • Birçok kaynağın bazı bağımlılıkları paylaştığı durumlarda kullanışlıdır.
  • Tüm kaynakların kwargs'lerini birleştirmiş gibi davranan bir TypedDict tanımlanır.
  • Kaynaklar keyfi argüman alacak şekilde yeniden yazıldıktan sonra TypedDict ile bağımlılık enjeksiyonu yapılır.
  • Tip sistemi sayesinde bağımlılık enjeksiyonunda argüman hataları veya eksikleri denetlenebilir.
  • Kaynak imzalarını değiştirmek ideal değildir, ancak bir bağımlılık enjeksiyonu framework'üne göre daha küçük bir değişikliktir.
  • Statik tip denetimini desteklemeyen framework çok fazladır.

Gelecekteki özellikler

  • PEP-728, ek öğelerin tipini tanımlamayı ve ek öğelere izin vermeyen kapalı sözlükler oluşturmayı mümkün kılar.
    • Record tiplerini daha doğru tanımlamaya yardımcı olur.
  • PEP-705, salt okunur öğeleri belirtmeyi mümkün kılar (duyuru zamanına bağlı olarak zaten yayımlanmış olabilir).
    • Sezgisel olarak uyumlu olması gereken farklı TypedDict'ler arasında, olası mutasyonlar (silme) nedeniyle ortaya çıkabilecek sorunları ele alır.

GN⁺ özeti

  • TypedDict, sözlük esnekliğinden yararlanarak alanların eksik olabildiği durumlarda avantaj sağlar.
  • TypedDict, dataclass veya pydantic gibi diğer veri yapılarından daha esnek bir seçenek sunar.
    • Alana göre uygun aracı seçin, ancak TypedDict'in avantajlarını da akılda tutun.

2 yorum

 
ilotoki0804 2024-10-15

Veriler sık sık dışarıdan JSON biçiminde geliyor ya da Python dışına aktarılıyorsa TypedDict kullanmak iyi olur; bunun dışındaki durumlarda ise yapılandırılmış dataclass veya NamedTuple kullanmanızı öneririm.

 
GN⁺ 2024-10-14
Hacker News yorumu
  • Dinamik tipleri tercih eden insanlar, tip sistemlerinin önemini giderek daha fazla fark ediyor

    • Daha iyi bir tip sistemi, daha kötü bir tip sisteminden üstündür
  • TypedDict yerine dataclass(slots=True) kullanma nedenleri

    • Öznitelik erişimi daha hızlıdır, bu yüzden kod daha hızlı çalışır
    • Slot sınıfları daha az RAM kullanır ve L1 cache üzerinde daha az baskı oluşturur; bu da kodu hızlandırır
    • Öznitelik erişiminde ["foobar"] yerine .foobar kullanmak bileği daha az yorar
    • Öznitelik adını yanlış yazarsanız çalışma zamanında hata oluşur
  • Tipleri zorlayan bir sistem yoksa TypedDict hiçbir işe yaramaz

    • String ile açıklanmış bir özelliğe yanlışlıkla bir hata kaydı koysanız bile, varsayılan Python bunu ne engeller ne de uyarır
    • Tipleri gerçekten zorlamak için Pydantic gibi araçlar kullanmak gerekir
  • "thank you think" başlığı gereğinden fazla kaba geliyor

    • "than i thought" kulağa daha iyi geliyor
  • Abonelikle ilgili cümlede "None" ifadesinin anlamı belirsiz

    • Dil bilgisi karmaşık olduğu için anlaması zor
  • TypedDict ile ilgili kişisel deneyim

    • Kodun okunabilirliğini artırmak için dict'leri açıklamakta TypedDict kullanıyorum
    • Kod yollarını takip etmek için harcadığım zamanı azaltabildim
    • Daha iyi kod yazma becerileri gerekli olsa da, çok sayıda dict kullanan uygulamalarda iyi bir çözüm
  • TypedDict'in işlevi iyi, ancak bildirim sözdizimi karmaşık