- Konu sahibi
- #1
Python’da sık yapılan hataları azaltmak için önce doğru yorumlayıcıyı ve proje ortamını kullanın; ardından girdileri doğrulayın, değiştirilebilir verilerin nasıl paylaşıldığını kontrol edin ve beklenen davranışları test edin. Bir hata oluştuğunda mesajı gizlemek yerine hata türünü ve ilgili satırı inceleyin. Bu yöntem bütün hataları ortadan kaldırmaz, ancak sorunu daha erken ve daha kolay bulunur hâle getirir.
Bir paketi yüklediğiniz hâlde
Python kuruluysa terminalde proje klasörüne geçip aşağıdaki komutu çalıştırın. Sisteminizde Python 3 komutu
Bu işlem proje klasöründe
Kod düzenleyicinizden çalıştırıyorsanız düzenleyicide seçili yorumlayıcının da bu ortamın içindeki Python olduğundan emin olun. Hata sürerse önce paket adını ve yükleme sırasında kullanılan yorumlayıcıyı kontrol edin; sanal ortam oluşturmak tek başına gerekli paketleri yüklemez.
Bir başka yaygın hata, fonksiyonun varsayılan parametresinde doğrudan boş liste kullanmaktır. Varsayılan liste her çağrıda yeniden oluşturulmadığından, bir çağrıda eklenen öğeler sonraki çağrıda da görülebilir. Her çağrıda ayrı bir liste istiyorsanız varsayılan değeri
Aşağıdaki varsayımsal örneği
Dosyanın bulunduğu klasörde
Hata çıktısında son satırdaki hata türünü ve mesajını okuyun; ardından traceback denen çağrı izindeki dosya ve satırları inceleyin.
Geçici tanılama çıktıları ekliyorsanız parola, erişim anahtarı veya kişisel veri yazdırmayın. Sorun çözüldüğünde bu çıktıları kaldırın.
Yukarıdaki örnekteki gibi testleri, yalnız normal sonuç için değil boş girdi, geçersiz değer ve sınır değerleri için de yazın. Bir test başarısız olursa beklenen değerle gerçek değeri karşılaştırın; hata kodda olabileceği gibi testin beklentisinde de olabilir.
Testlerin geçmesi yalnızca sınadığınız durumların beklendiği gibi sonuçlandığını gösterir; programın her girdiyle veya sunucu ortamında sorunsuz çalıştığını kanıtlamaz. Otomasyon ve sunucu betiklerinde ayrıca dosya bulunamaması, erişim izni ve dış servis hataları gibi ilgili durumları güvenli bir test ortamında sınayın.
Doğru Python ortamıyla çalışın
Bir paketi yüklediğiniz hâlde
ModuleNotFoundError alıyorsanız paketi yükleyen Python ile kodu çalıştıran Python farklı olabilir. Projeye özel sanal ortam, paketleri diğer projelerin paketlerinden ayrı tutmaya yardımcı olur.Python kuruluysa terminalde proje klasörüne geçip aşağıdaki komutu çalıştırın. Sisteminizde Python 3 komutu
python3 ise python yerine onu kullanın:
Kod:
python -m venv .venv
Bu işlem proje klasöründe
.venv adlı ortamı oluşturur. Ortamı etkinleştirmeden de onun yorumlayıcısını doğrudan kullanabilirsiniz. Örneğin Linux veya macOS’ta .venv/bin/python, Windows’ta .venv\Scripts\python.exe yolunu kullanın. Paket yüklerken de aynı yorumlayıcıyı kullanmak için komuta -m pip install paket_adı ekleyin.Kod düzenleyicinizden çalıştırıyorsanız düzenleyicide seçili yorumlayıcının da bu ortamın içindeki Python olduğundan emin olun. Hata sürerse önce paket adını ve yükleme sırasında kullanılan yorumlayıcıyı kontrol edin; sanal ortam oluşturmak tek başına gerekli paketleri yüklemez.
Girdileri ve değiştirilebilir değerleri dikkatle kullanın
input() ile alınan değer metindir. Sayısal işlem yapmadan önce uygun tür dönüşümünü uygulayın; örneğin int(deger), tam sayı biçimindeki metni dönüştürür. Kullanıcı harf veya geçersiz bir sayı girerse ValueError oluşur. Böyle bir girdiyi yakalayıp kullanıcıdan yeniden istemek, hatayı sessizce sıfıra çevirmekten daha güvenilirdir.Bir başka yaygın hata, fonksiyonun varsayılan parametresinde doğrudan boş liste kullanmaktır. Varsayılan liste her çağrıda yeniden oluşturulmadığından, bir çağrıda eklenen öğeler sonraki çağrıda da görülebilir. Her çağrıda ayrı bir liste istiyorsanız varsayılan değeri
None yapıp listeyi fonksiyon içinde oluşturun.Aşağıdaki varsayımsal örneği
test_liste.py adıyla kaydedin:
Python:
import unittest
def ekle(deger, liste=None):
if liste is None:
liste = []
liste.append(deger)
return liste
class ListeTesti(unittest.TestCase):
def test_cagrilar_bagimsiz(self):
self.assertEqual(ekle("elma"), ["elma"])
self.assertEqual(ekle("armut"), ["armut"])
def test_verilen_liste_kullanilir(self):
liste = ["elma"]
self.assertEqual(ekle("armut", liste), ["elma", "armut"])
if __name__ == "__main__":
unittest.main()
Dosyanın bulunduğu klasörde
python test_liste.py komutunu çalıştırın. OK ve iki testin çalıştığını gösteren çıktı beklenir. İlk test, liste verilmediğinde iki çağrının birbirinden bağımsız olduğunu sınar. İkinci testte ise açıkça verilen liste değiştirilir; özgün listenin korunmasını istiyorsanız fonksiyon içinde kopyasını oluşturmanız gerekir.Hata mesajını okuyun, hatayı gizlemeyin
Hata çıktısında son satırdaki hata türünü ve mesajını okuyun; ardından traceback denen çağrı izindeki dosya ve satırları inceleyin.
SyntaxError durumunda sorun bildirilen satırda veya hemen öncesinde eksik iki nokta ya da kapanmamış parantez olabilir. TypeError ise işlemin aldığı değerlerin türlerini incelemek için bir başlangıç noktasıdır.try ve except kullanırken yalnız nasıl ele alacağınızı bildiğiniz hataları yakalayın. Örneğin tam sayı dönüşümünün çevresinde ValueError yakalamak uygundur; geniş bir except: pass kullanmak ise beklenmedik hataları da gizleyebilir. Hatayı yeniden üretmek için gereken girdiyi küçültün ve düzeltmeden sonra aynı durumu tekrar çalıştırın.Geçici tanılama çıktıları ekliyorsanız parola, erişim anahtarı veya kişisel veri yazdırmayın. Sorun çözüldüğünde bu çıktıları kaldırın.
Testleri sınır durumlarıyla genişletin
Yukarıdaki örnekteki gibi testleri, yalnız normal sonuç için değil boş girdi, geçersiz değer ve sınır değerleri için de yazın. Bir test başarısız olursa beklenen değerle gerçek değeri karşılaştırın; hata kodda olabileceği gibi testin beklentisinde de olabilir.
Testlerin geçmesi yalnızca sınadığınız durumların beklendiği gibi sonuçlandığını gösterir; programın her girdiyle veya sunucu ortamında sorunsuz çalıştığını kanıtlamaz. Otomasyon ve sunucu betiklerinde ayrıca dosya bulunamaması, erişim izni ve dış servis hataları gibi ilgili durumları güvenli bir test ortamında sınayın.