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)))
İ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. ) İ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.
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.
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 assert
ion 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.
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.
Oldukça açıklayıcı oldu teşekkür ederim.