Bu açık bir sorudur ve üzerinde durmak istediğim iki yönü var: ne zaman iddialar ekleyeceğim ve hata mesajlarını nasıl yazacağım.
amaç
Bunu yeni başlayanlara açıklamak - iddialar hataları artırabilecek ifadelerdir, ancak onları yakalamayacaksınız. Ve normalde yetiştirilmemelidirler, ancak gerçek hayatta bazen yine de kaldırılırlar. Ve bu, 'ölümcül hata' dediğimiz kodun kurtarılamadığı ciddi bir durumdur.
Daha sonra, doğru olsa da çok küçümseyici olan 'hata ayıklama amaçları' içindir. Farklı yeni başlayanlarda farklı şekilde çalışmasına rağmen 'asla ihlal edilmemesi gereken' formülasyonu daha iyi tanımlamamı seviyorum ... Bazıları 'sadece olsun' ve diğerleri bunun için herhangi bir fayda bulamıyor veya normal istisnaları değiştiriyor, hatta akışını bile kontrol edebilir.
stil
Python'da assert
bir ifade değil, bir işlevdir! (hatırlamayacaksınız assert(False, 'is true')
. Ama bunu yoldan çıkarmak:
İsteğe bağlı 'hata mesajı' ne zaman ve nasıl yazılır?
Bu acually sık (iddialarını yapmak için birçok özel yöntemleri var ünite test çerçeveler için geçerlidir assertTrue(condition)
, assertFalse(condition), assertEqual(actual, expected)
vs.). Ayrıca, genellikle iddiayı yorumlamak için bir yol sağlarlar.
Uzaklaştırma kodunda hata mesajları olmadan yapabilirsiniz.
Bazı durumlarda, iddiaya eklenecek hiçbir şey yoktur:
def dökümü (bir şey): iddia isinstance (bir şey, Dumpable) # ...
Ancak bunun dışında, bir mesaj diğer programcılarla (bazen kodunuzun etkileşimli kullanıcıları olan, örneğin Ipython / Jupyter vb.) İletişim için yararlıdır.
Onlara sadece iç uygulama ayrıntılarını sızdırmayan bilgiler verin.
onun yerine:
assert meaningless_identifier <= MAGIC_NUMBER_XXX, 'meaningless_identifier is greater than MAGIC_NUMBER_XXX!!!'
yazmak:
assert meaningless_identifier > MAGIC_NUMBER_XXX, 'reactor temperature above critical threshold'
hatta belki:
assert meaningless_identifier > MAGIC_NUMBER_XXX, f'reactor temperature({meaningless_identifier }) above critical threshold ({MAGIC_NUMBER_XXX})'
Biliyorum, biliyorum - bu statik bir iddia için bir durum değil, ama mesajın bilgi değerine işaret etmek istiyorum.
Olumsuz mu, olumlu mesaj mı?
Bu tartışmalı olabilir, ancak aşağıdaki gibi şeyleri okumak bana acı veriyor:
assert a == b, 'a is not equal to b'
bunlar birbirinin yanında yazılan iki çelişkili şeydir. Kod tabanı üzerinde her bir etkiye sahip olduğumda, ne istemediğimizi belirtmek için 'zorunluluk' ve 'zorunluluk' gibi ekstra fiiller kullanarak ne istediğimizi belirtmeye çalışırım.
a == b, 'a b'ye eşit olmalı'
Daha sonra, alma AssertionError: a must be equal to b
da okunabilir ve ifade kodda mantıklı görünür. Ayrıca, geri izlemeyi okumadan bir şey elde edebilirsiniz (hatta bazen mevcut olmayabilir).