Kafamı kuma gömmüş, kodun akışına kapılmış gidiyordum. Python'da tipleri düşünmeden, dynamic typingin o rahat, bol keseden atılan değişkenlerinin keyfini çıkarıyordum. "Şu fonksiyondan ne dönerse dönsün, ben hallederim" modundaydım. Her şey çok güzeldi... Ta ki gece saat 03:00'e kadar.
Birden terminalde o korkunç, beyaz, masum görünümlü hata satırı patladı:
Python:
AttributeError: 'NoneType' object has no attribute 'something'
StackOverflow'da bile aradığımda bulamayacağım türden bir anda gelişti. Meğerse, güvendiğim o fonksiyon, belirli bir koşulda hiç oralı olmadan None döndürüvermiş. Ben de sanki bir obje dönüyormuş gibi, hiç if result is not None: demeden, direkt attribute'una ulaşmaya çalışmışım. Şaka gibi ama o an dünyam başıma yıkıldı. O rahatlık hissi, yerini buz gibi bir paniğe bıraktı.
Neyse ki, print() bombardımanı ve biraz da göz yaşıyla sorunun kaynağını buldum. Meğerse sorun şuradaymış: bir API çağrısından dönen JSON'da bazen o alan null geliyormuş, benim requests kütüphanesiyle yaptığım parsede, o alanın olmadığı durumu hiç hesaba katmamışım. Kafayı yiyecektim.
Python:
# Kötü (Gece 03:00'teki ben)
deger = get_data_from_api().get('critical_field')
sonuc = deger['something'] # İşte burada patladı!
# Ders Alınmış Hali
deger = get_data_from_api().get('critical_field')
if deger is not None:
sonuc = deger.get('something', 'varsayilan_deger')
else:
# None geldiği durumu yönet
sonuc = 'varsayilan_deger'
# veya logla, fırlat, vs.
Dynamic typing rahatlık sağlıyor evet, ama bu, "savunmasız kod yaz" anlamına gelmiyor. Özellikle dış kaynaklardan (API, dosya, kullanıcı) gelen verilerde None kontrolü yapmak ya da .get() metodunu default değerle kullanmak şart.
O geceden sonra, dynamic typing'e olan körü körüne güvenim sarsıldı. Artık şüpheciyim. "Acaba bu None döner mi?" diye düşünmeden edemiyorum. Siz de böyle bir `NoneType` tuzağına düştünüz mü? Yoksa benim gibi gece yarısı kod yazmanın cezasını mı çekiyorum? Bu tür hataları önlemek için başka hangi yöntemleri kullanıyorsunuz? (Type hints mi, daha sıkı test mi?) Yorumlara bekliyorum!