Assert deyimi nasıl kullanılır?

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

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)))
9 Beğeni

İ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?

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.

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)

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

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.

1 Beğeni

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.

2 Beğeni

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.

Konuyu hortlatıyorum ama,

Ben bu soruya cevap alamadım. İf else gibilerini fonksiyon yapamazsınız çünkü belirli sözdizimleri vardır. Ama bunu fonksiyon olarak yazarsınız.

Python -O argümanı ile çalıştığında assert anahtar kelimeleri görmezden geliniyor, aynı şeyi if için yapamazdık.

Yapabilirsin. Dil isterse if-else’yi sadece fonksiyon olarak da verebilir.

1 Beğeni

Arkadaşlar Merhaba,
Yeni öğreniyorum basitse kusura bakmayın sorum öncelikle,
assert ile ilgili aşağıdaki kullanımı anlamadım yardımcı olabilecek varsa teşekkür ederim.

edges = [(1, 0)]

def edge_exists(i, j): return (i, j) in edges
assert edge_exists(1, 0)
assert not edge_exists(0, 1)

edge_exists() bir fonksiyon.
Parametre olarak aldığı i ve j’nin, bir tuple olarak edges içerisinde yer alıp almadığını kontrol ediyor ve buna göre True veya False döndürüyor.
Mesela edges = [(1, 0)] olarak belirtilmiş.
Biz edge_exists(1, 0)True değerini elde ederiz.
Fakat edge_exists(0, 1)False olacaktır. Çünkü (0, 1), edges içerisinde yer almıyor.

assert edge_exists(1, 0), burada edge_exists(1, 0) True olarak dönmezse AssertionError belirecektir.
Benzer bir şekilde,
assert not edge_exists(0, 1), burada edge_exists(0, 1) False olarak dönmezse yine AssertionError belirecektir. not kullanımının olayı negatifleştirdiğini fark etmişsinizdir.

1 Beğeni

Oldukça açıklayıcı oldu teşekkür ederim.