Programcılar için hata ayıklama temel bir beceridir, bir zanaattır ve bu konuda daha iyi olmak için pratik yapmanız gerekmektedir. Burada, Python kodunuzda hata ayıklamak için faydalı püf noktaları ve araçları nelerdir?
1. Bir işlevin veya nesnenin kaynak kodunu görüntüleyin
Hata ayıklamada uygulamanın ayrıntılarının kritik olduğunu bilin. Bir Python kodunda hata ayıklarken, bir modülün, sınıfın, yöntemin, işlevin, geri dönüşün, çerçevenin veya kod nesnesinin kaynak kodunu bilmek isteyebilirsiniz. Teftiş modülü size yardımcı olacaktır:
içe aktarma denetleme
hatası ekle (x, y):
x + y döndürclass Dog:
kind = 'dog' # tüm örnekler tarafından paylaşılan sınıf değişkeni
def __init __ (self, name):
self.name = name # her örnek için benzersiz örnek değişkeni def eat (yemek):
baskı ("yemek ..." + yiyecek)print (inspect.getsource (add))
print (inspect.getsource (Dog))
print (inspect.getsource (Dog.eat))
2. Günlüğü Dosyaya yazdırın
Günlük , kodun çalışma zamanını anlamamız için en önemli ipucudur. Günlüğü yazdırmak, programın yürütme akışını takip etmenin yararlı bir yoludur.
Ancak, Python'da yazdır yalnızca bir terminale çıktı verir. Özellikle sunucu tarafı uygulamalar için karmaşık sorun giderme için ideal olmaktan uzaktır.
Baskı daha bağımsız değişkenler alan ve bir günlük dosyasına bazı argümanlar kutu çıktı üretmesi baskı içeriğini belirten çünkü Python 3'te işlev çok daha güçlüdür.
f olarak open ('test.log', mode = 'w') ile:
print ('merhaba, python', file = f, flush = True)
3. Uygulama zamanını takip edin
Performans sorunları için, bir fonksiyonun çalışma süresini hesaplamanız gerekir. Bunu şu şekilde başarabilirsin:
ithalat zamanıstart = time.time ()
# fonksiyonu çalıştır
end = time.time ()baskı (bitiş-başlangıç)
Timeit adında yerleşik bir modül var , sadece bir satır kodla zamanı izlemek için kullanabiliriz:
içe aktarma zamanı
içe aktarma zamanıdef run_sleep (saniye):
baskı (saniye)
zaman.sleep (saniye)baskı (timeit.timeit (lambda: run_sleep (2), sayı = 1))
4. Etkileşimli hata ayıklama
REPL, artımlı, etkileşimli bir geliştirme stilini destekler ve etkileşimli hata ayıklama daha verimli bir yoldur. İdeal iş akışı, tekrarlanan düzenleme-çalıştırma sürecidir.
Etkileşimli oturumu olan bir programı çağırmak için -i seçeneğini eklememiz gerekir :
python -i demo.py
Hayatınızı kolaylaştırmak için importlib.reload (module) etkileşimli oturumu yeniden başlatmaktan kaçınmanın uygun bir yoludur.
Bir örnek alalım, demo adlı bir işlevi çalıştırdığımızı varsayalım, bir sorunu çözmek için bu işlev için bazı değişiklikler yapmamız gerekiyor, ardından yeniden yükle (modül) , oturumumuzu yeniden başlatmadan demonun değiştirilmiş sürümünü yükleyecektir:
>>> importlib'den içe aktarma yeniden yükleme
>>> modülden içe aktarma demosu
>>> demo ()
" Demonun sonucu ..."# "Demo" da bazı değişiklikler yapın
>>> demo ()
"Demonun sonucu ..." # Eski sonuç
>>> yeniden yükle (modül) # "Demo" da yapılan değişikliklerden sonra "modülü" yeniden yükle
>>> demo ()
"Bu yeni sonuç olacak ...">>> # düzelt ve yeniden dene çemberini tekrar et
Bu, hata ayıklama için çok zaman kazandıracaktır.
5. pdb kullanın
Python, etkileşimli kaynak kodu hata ayıklayıcısını desteklemek için pdb adlı bir modüle sahiptir . Hat seviyesinde tek adımla kesme noktalarının ayarlanmasını destekler. Ek olarak, yığın çerçevelerinin pdb baskı denetimi, değişkenlerin değerleri, kaynak kodu inceleme vb.
Bir programı hata ayıklayıcı ile başlatmak için, komut dosyalarını çağırmak için -m pdb seçeneğini ekleyin :
user @ coderscat: ~ / snippet $ python3.7 -m pdb demo.py
> /home/user/snippets/demo.py(1) <module> ()
-> içe aktarma denetimi
(Pdb) l
1 -> içe aktarma denetimi
2
3 def gcd (a, b):
4 if (b == 0):
5 return a
6 else:
7 return gcd (b, a% b)
8
9
10 print (gcd (34, 34))
[EOF]
( Pdb) b demo.py:3
Kesme Noktası 1, /home/user/snippets/demo.py:3
(Pdb) c
> /home/user/snippets/demo.py(3) <module> ()
-> def gcd (a, b):
(Pdb) adım
> /home/user/snippets/demo.py(10) <module> ()
-> print (gcd (34, 34))
(Pdb)
Çalışan bir programdan hata ayıklayıcıya girmek için başka bir tipik kullanım, şunu eklemektir:
pdb'yi içe aktar; pdb.set_trace ()
İşte bazı yararlı pdb komutu
- liste (l): size Python yorumlayıcısının şu anda bulunduğu kod satırını gösterir
- adım (lar): uygulamaya satır satır devam edin, işleve adım atın
- next (n): sonraki kod satırına devam et
- break (b): geçerli satırda yeni kesme noktası kur
- devam et (c): bir sonraki kesme noktasına kadar yürütmeye devam et
Çoğu durumda, yürütmedeki her adımı takip etmemize gerek yoktur, pdb , Python programında hata ayıklamak için en iyi araçtır.