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
Veriler sık sık dışarıdan JSON biçiminde geliyor ya da Python dışına aktarılıyorsa
TypedDictkullanmak iyi olur; bunun dışındaki durumlarda ise yapılandırılmışdataclassveyaNamedTuplekullanmanızı öneririm.Hacker News yorumu
Dinamik tipleri tercih eden insanlar, tip sistemlerinin önemini giderek daha fazla fark ediyor
TypedDictyerinedataclass(slots=True)kullanma nedenleri["foobar"]yerine.foobarkullanmak bileği daha az yorarTipleri zorlayan bir sistem yoksa
TypedDicthiçbir işe yaramazPydanticgibi araçlar kullanmak gerekir"thank you think" başlığı gereğinden fazla kaba geliyor
Abonelikle ilgili cümlede "None" ifadesinin anlamı belirsiz
TypedDictile ilgili kişisel deneyimTypedDictkullanıyorumTypedDict'in işlevi iyi, ancak bildirim sözdizimi karmaşık