Assert deyimi nasıl kullanılır?


#1

Assert deyimi nasıl kullanılıyor? İnternette Türkçe bir kaynak bulamadım ya da dikkatli aramadım. Ama İdle’ın kaynak kodunda görünce araştırmak zorunda kaldım:

def insertfilter(self, filter):
# Perhaps rename to pushfilter()?
assert isinstance(filter, Delegator)
assert filter.delegate is None
filter.setdelegate(self.top)
self.top = filter


#2

Assert deyimi “iddia etmek” anlamına geliyor. Yani bir iddiada bulunduğumuz zaman, o iddiamız doğruysa sorun yok ancak yanlışsa AssertionError isimli bir hata alırız. Konuyla ilgili basit örnekler yapmaya çalışalım.

def fonksiyon(liste):
    for i in liste:
        try:
            assert i <= 5
            #İddianın doğru olduğu durumda, bu aralıkta yeni işlemler de tanımlanabilir.
        except AssertionError:
            print("{} sayısı 5'den büyük".format(i))

liste = [1, 2, 3, 4, 5, 6]
fonksiyon(liste)

Başka bir örnek:

def fonksiyon(liste):
    for i in liste:
        try:
            assert str(i).isnumeric()
            #İddianın doğru olduğu durumda, bu aralıkta yeni işlemler de tanımlanabilir.
        except AssertionError:
            print("{} karakteri sayı değil.".format(repr(i)))

liste = [1, 2, 3, 4, 5, "a"]
fonksiyon(liste)

Başka bir örnek:

liste = [0, 2, 45, 11, 19]
sözlük = {0: "a", 11: "b", 34: "c", 2: "d"}
for i in liste:
    try:
        assert i in sözlük
        #İddianın doğru olduğu durumda, bu aralıkta yeni işlemler de tanımlanabilir.
    except AssertionError:
        print("{} sözlük anahtarı değil.".format(repr(i)))

#3

İyi de ben neden assert deyimini kullanayım ki?

a = ["ubuntu"," windows", "macOS"]

if "ubuntu" in a:
    #Burada koşul doğruysa yapılacak işlemler var
else:
    # Koşul yanlışsa burası çalışır

Python gibi bir dilde neden böyle bir deyim olsun ki?


#4

Sadece Python’da değil bir çok dilde assert deyimi vardır ve kabaca sizin yazdığınız koşulun eşleniği konumundadır.


#5

Sanırım bu deyim modüllerde olmaması gereken bir durum meydana geldiğinde işe yarıyor.

assert version < 3

Bu doğruysa modül çalışmaya devam eder. Yanlışsa yani versiyon 3 sürümünden büyükse yazılımcı bunu anlar.

Peki neden fonksiyon yapılmamış bu deyim? :

def _assert(kosul):
    if not kosul: raise AssertionError;
_assert(version < 3)

#6

Sadece modüllerle alakalı değil, genellikle hata oluşturabilecek durumlara karşı kullanılır ve if deyimine benzer şekilde çalışır.


#7

assert deyimi if ile yazılabilir. Ancak bunlar arasında birkaç önemli fark vardır. Birincisi assert deyimi daha kısadır. (Tamam, çok önemli bir fark değil. :slight_smile:) İkincisi ise program çalıştırılırken eniyileştirme sürecinde assert deyimlerinin kaldırılabilmesidir. Bunu if eşleniğinde yapamazsınız.


#8

Mesela bir programı yazarken kesInlikle sağlanması gereken bir ifademiz var. Böyle durumlarda assert metodunu kullanarak hata olduğunda hatalara çabuk bulabilirız. Uzun ve kompleks programlarda bu metod sayesinde oluşan hatayı hemen yakalayabilir ve düzeltebiliriz. Aksi taktirde hatayı ayıklamak için bütün kodlarımızı baştan aşağıya incelememiz gerekir. İstediğimiz zaman da kolaylıkla devre dışı bırakabiliriz. Diyelim ki if metodunu kullandık; ve programın daha hızlı çalışması ve çok yer kaplamasını istemiyoruz.Ozaman bütün yazdıklarımızı teker teker silmemiz gerekecek ve bunları silerken de yanlışlıkla başka amaçla kullandığımız if else kodlarını silme tehlikesi var. O yüzden hata ayıklamada assert metodu işimizi çok kolaylaştırır.


#9

Madem konuya ekleme yapiyoruz:

assert koddaki varsayimlari belirtmek ve saglamak icin kullanilir.

Mesela asla 0 dondurmeyecegini belgelemis bir sistem fonksiyonu 0 dondurdugunde kod harikulade bir sekilde patliyorsa (“Kullanici bulunamadi” hatasi vermek yerine rastgele bir kullaniciyla devam ediyorsa) oraya bir assertion koymak mantikli olabilir.

assert'e False deger geldiginde olusan Assertion Error, programcinin sistemle (veya dunyayla) ilgili varsayimlarinin yanlis oldugunu belirttigi icin yapilacak en guvenli sey, programin calismasini o noktada durdurmaktir. (Hic calismamasi yanlis calismasindan daha iyi diye.) Bu yuzden AssertionError'i catch etmenin normal bir kullanim alanini dusunemiyorum.