Cóż, jest to pytanie otwarte i mam dwa aspekty, które chcę dotknąć: kiedy dodawać twierdzenia i jak pisać komunikaty o błędach.
Cel, powód
Aby wytłumaczyć to początkującym - twierdzenia są stwierdzeniami, które mogą wywoływać błędy, ale ich nie złapiecie. I zwykle nie należy ich wychowywać, ale w rzeczywistości czasami i tak się wychowują. Jest to poważna sytuacja, z której kod nie może się zregenerować, co nazywamy „fatalnym błędem”.
Następnie służy do „celów debugowania”, co, choć poprawne, wydaje się bardzo lekceważące. Podoba mi się sformułowanie „deklarowanie niezmienników, które nigdy nie powinno być naruszane”, chociaż działa inaczej na różnych początkujących ... Niektórzy „po prostu to rozumieją”, a inni albo nie znajdują zastosowania, albo zastępują normalne wyjątki, a nawet kontrolować przepływ za jego pomocą.
Styl
W Pythonie assert
jest instrukcją, a nie funkcją! (pamiętajcie, assert(False, 'is true')
że nie podniesie. Ale odsuwając to na bok:
Kiedy i jak napisać opcjonalny „komunikat o błędzie”?
Ten acually dotyczy testów jednostkowych ram, które często mają wiele dedykowanych metod zrobić twierdzeń ( assertTrue(condition)
, assertFalse(condition), assertEqual(actual, expected)
etc.). Często stanowią również sposób skomentowania tego twierdzenia.
W kodzie wyrzucającym można obejść się bez komunikatów o błędach.
W niektórych przypadkach do twierdzenia nie można nic dodać:
def dump (coś): assert isinstance (coś, Dumpable) # ...
Ale poza tym wiadomość jest przydatna do komunikacji z innymi programistami (którzy czasami są interaktywnymi użytkownikami twojego kodu, np. W Ipython / Jupyter itp.).
Podaj im informacje, a nie tylko wyciek wewnętrzne szczegóły implementacji.
zamiast:
assert meaningless_identifier <= MAGIC_NUMBER_XXX, 'meaningless_identifier is greater than MAGIC_NUMBER_XXX!!!'
pisać:
assert meaningless_identifier > MAGIC_NUMBER_XXX, 'reactor temperature above critical threshold'
a może nawet:
assert meaningless_identifier > MAGIC_NUMBER_XXX, f'reactor temperature({meaningless_identifier }) above critical threshold ({MAGIC_NUMBER_XXX})'
Wiem, wiem - nie dotyczy to twierdzenia statycznego, ale chcę wskazać wartość informacyjną wiadomości.
Wiadomość negatywna czy pozytywna?
Może to być kontrowersyjne, ale boli mnie czytanie takich rzeczy:
assert a == b, 'a is not equal to b'
są to dwie sprzeczne rzeczy napisane obok siebie. Więc ilekroć mam wpływ na bazę kodu, naciskam na określenie tego, czego chcemy, używając dodatkowych czasowników, takich jak „musi” i „powinien”, a nie mówiąc, czego nie chcemy.
twierdzić a == b, „a musi być równe b”
Następnie pobieranie AssertionError: a must be equal to b
jest również czytelne, a instrukcja wygląda logicznie w kodzie. Ponadto możesz coś z niego wyciągnąć bez czytania śledzenia (które czasami może nawet nie być dostępne).