Oto cztery proste wywołania assert:
>>> assert 1==2
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError
>>> assert 1==2, "hi"
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError: hi
>>> assert(1==2)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError
>>> assert(1==2, "hi")
Zwróć uwagę, że ostatnia nie powoduje błędu. Jaka jest różnica między wywoływaniem funkcji assert z nawiasami lub bez, które powodują takie zachowanie? Moją praktyką jest używanie nawiasów, ale powyższe sugeruje, że nie powinienem.
python
assert
parentheses
gaefan
źródło
źródło
Odpowiedzi:
Ten ostatni
assert
dałby ci ostrzeżenie (SyntaxWarning: assertion is always true, perhaps remove parentheses?
), gdybyś przepuścił go przez pełny interpreter, a nie przez IDLE. Ponieważassert
jest to słowo kluczowe, a nie funkcja, w rzeczywistości przekazujesz krotkę jako pierwszy argument, a pozostawiasz drugi argument.Przypomnij sobie, że niepuste krotki oceniają do
True
, a ponieważ komunikat potwierdzenia jest opcjonalny, w zasadzie zadzwoniłeśassert True
podczas pisaniaassert(1==2, "hi")
.źródło
assert (1==2)
jest to, że nawiasy wokół pojedynczego wyrażenia nie utworzą automatycznie krotki; miałbyś takie samo zachowanie jak # 4, gdybyś to zrobiłassert (1==2,)
. To samo by się stało, gdybyś zrobiłprint ('foo', 'bar')
zamiastprint 'foo', 'bar'
; zobaczysz wypisaną krotkęassert(test, message)
prawdopodobnie są błędne, a na pewno mylące. Żadnych parens!Jeśli umieścisz tam nawias, ponieważ chcesz uzyskać potwierdzenie wielowierszowe, alternatywą jest umieszczenie ukośnika odwrotnego na końcu linii w następujący sposób:
Wydruki:
Dlaczego ten Python
assert
musi się różnić od wszystkiego innego:Myślę, że ideologia Pythona polega na tym, że program powinien samokorygować się bez martwienia się o specjalną flagę włączającą potwierdzenia. Pokusa wyłączania potwierdzeń jest zbyt duża i dlatego jest przestarzała.
Podzielam twoją irytację, że python
assert
ma unikalną składnię w stosunku do wszystkich innych konstrukcji programowania w Pythonie, a ta składnia ponownie zmieniła się z python2 na python3 i ponownie z pythona 3.4 na 3.6. Sprawianie, że instrukcje assert nie są wstecznie kompatybilne z żadnej wersji do żadnej innej wersji.To dotknięcie w ramię, które
assert
jest obywatelem trzeciej klasy, zostanie całkowicie usunięte w Pythonie4, a na pewno ponownie w Pythonie 8.1.źródło
assert 1==2, "hi"
jest analizowany tak, jakassert 1==2, "hi"
„hi” jako drugi parametr słowa kluczowego. Stąd, dlaczego poprawnie daje błąd.assert(1==2)
jest analizowany jakoassert (1==2)
identyczny zassert 1==2
, ponieważ powiązania wokół pojedynczego elementu nie tworzą krotki, chyba że na końcu znajduje się przecinek, np(1==2,)
.assert(1==2, "hi")
jest analizowany jakoassert (1==2, "hi")
, co nie daje błędu, ponieważ niepusta krotka(False, "hi")
nie jest wartością fałszywą i nie ma drugiego parametru dostarczonego do słowa kluczowego.Nie powinieneś używać nawiasów, ponieważ
assert
nie jest to funkcja w Pythonie - to słowo kluczowe.źródło
Możesz złamać oświadczenie assert bez
\
tego:Lub jeśli masz jeszcze dłuższą wiadomość:
źródło
Poniższy cytat pochodzi z dokumentu Python
Prosta forma, wyrażenie assert, jest równoważne
if __debug__: if not expression: raise AssertionError
Forma rozszerzona, assert expression1, expression2 , jest równoważna
if __debug__: if not expression1: raise AssertionError(expression2)
Więc kiedy używasz tutaj nawiasów, używasz prostej formy, a wyrażenie jest oceniane jako krotka, co jest zawsze Prawdą, gdy jest rzutowane na bool
źródło