Hier sind vier einfache Aufrufe zur Behauptung:
>>> 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")
Beachten Sie, dass der letzte keinen Fehler auslöst. Was ist der Unterschied zwischen dem Aufruf von assert mit oder ohne Klammer, der dieses Verhalten verursacht? Meine Praxis besteht darin, Klammern zu verwenden, aber das oben Gesagte legt nahe, dass ich dies nicht tun sollte.
python
assert
parentheses
gaefan
quelle
quelle
Antworten:
Der letzte
assert
hätte Ihnen eine Warnung (SyntaxWarning: assertion is always true, perhaps remove parentheses?
) gegeben, wenn Sie ihn durch einen vollständigen Interpreter und nicht durch IDLE ausgeführt hätten. Daassert
es sich um ein Schlüsselwort und nicht um eine Funktion handelt, übergeben Sie tatsächlich ein Tupel als erstes Argument und lassen das zweite Argument weg.Denken Sie daran, dass nicht leere Tupel ausgewertet
True
werden. Da die Bestätigungsnachricht optional ist, haben Sieassert True
beim Schreiben im Wesentlichen angerufenassert(1==2, "hi")
.quelle
assert (1==2)
Klammern um einen einzelnen Ausdruck nicht automatisch ein Tupel erstellen. Sie würden das gleiche Verhalten wie # 4 erhalten, wenn Sie dies tun würdenassert (1==2,)
. Das gleiche würde passieren, wenn Sie esprint ('foo', 'bar')
stattdessen tun würdenprint 'foo', 'bar'
; Sie würden das ausgegebene Tupel sehenassert(test, message)
wahrscheinlich falsch und sicherlich verwirrend sind. Keine Eltern!Wenn Sie die Klammer dort einfügen, weil Sie eine mehrzeilige Zusicherung wünschen, können Sie alternativ einen Backslash am Ende der Zeile wie folgt einfügen:
Drucke:
Warum muss sich diese Python
assert
von allem anderen unterscheiden:Ich denke, die pythonische Ideologie ist, dass sich ein Programm selbst korrigieren sollte, ohne sich um die spezielle Flagge kümmern zu müssen, um Asserts einzuschalten. Die Versuchung, Behauptungen auszuschalten, ist zu groß und wird daher abgelehnt.
Ich teile Ihren Ärger darüber, dass Python
assert
im Vergleich zu allen anderen Python-Programmierkonstrukten eine eindeutige Syntax hat, und diese Syntax hat sich erneut von Python2 zu Python3 und erneut von Python 3.4 zu 3.6 geändert. Assert-Anweisungen von keiner Version zu einer anderen Version abwärtskompatibel machen.Es ist ein Druck auf die Schulter, der
assert
ein Bürger der 3. Klasse ist. Er wird in Python4 und sicherlich wieder in Python 8.1 vollständig entfernt.quelle
assert 1==2, "hi"
wird wieassert 1==2, "hi"
mit "hi" als zweitem Parameter für das Schlüsselwort analysiert . Daher gibt es richtig einen Fehler.assert(1==2)
wird alsassert (1==2)
identisch analysiertassert 1==2
, da Parens um ein einzelnes Element kein Tupel erstellen, es sei denn, es gibt ein nachfolgendes Komma, z(1==2,)
.assert(1==2, "hi")
wird als analysiertassert (1==2, "hi")
, was keinen Fehler ergibt, da ein nicht leeres Tupel(False, "hi")
kein falscher Wert ist und dem Schlüsselwort kein zweiter Parameter zugewiesen wird.Sie sollten keine Klammern verwenden, da dies
assert
in Python keine Funktion ist - es ist ein Schlüsselwort.quelle
Sie können die Assert-Anweisung ohne Folgendes brechen
\
:Oder wenn Sie noch längere Nachricht haben:
quelle
Das Folgende wird aus dem Python-Dokument zitiert
Die einfache Form, Assert-Ausdruck, entspricht
if __debug__: if not expression: raise AssertionError
Die erweiterte Form, assert expression1, expression2 , entspricht
if __debug__: if not expression1: raise AssertionError(expression2)
Wenn Sie hier also Klammern verwenden, verwenden Sie die einfache Form, und der Ausdruck wird als Tupel ausgewertet. Dies ist immer wahr, wenn er in bool umgewandelt wird
quelle