Ich habe Vergangenheit ein wenig angesprochen, aber ich habe einen Artikel gefunden, der es verständlicher erklärt, also habe ich die Bedeutung der Überprüfung aufgenommen. Nachgedruckt aus dem Blog von Great Senior, auch bekannt als unser Verdienst gehört unseren legendären cs-Alumni
Traceback message
Traceback (most recent call last):
File "<pyshell#29>", line 3 in <module>
result = buggy(5)
File <pyshell#29>", line 5 in buggy
return f + x
TypeError: unsupported operand type(s) for +: 'function' and 'int'
Die Traceback-Nachricht druckt den Prozess in chronologischer Reihenfolge, wenn der Fehler aufgetreten ist. Der Boden ist der neueste. Ein Satz enthält zwei Rückverfolgungsnachrichten. Die erste "Datei" <pyshell # 29> ", Zeile 3 in result = buggy (5)
bleibt wie es ist, aber der tatsächliche Code wird angezeigt.
Error messages
Die Fehlermeldung wird in die letzte Zeile geschrieben. Fehlermeldung<Fehlertyp>: <Fehlermeldung>
wird im Format des Fehlertyps (Syntaxfehler, Typfehler usw.) und der Fehlerdetails beschrieben.
Debugging
def foo(x):
"""A random function.
>>> foo(4)
4
>>> foo(5)
5
"""
Vom Terminal python3 -m doctest file.py
Sie können python3 -m doctest file.py -v
verwenden, um zu erfahren, welcher Test bestanden wurde und welcher stecken geblieben ist.
In der Regel beschreibt die erste Zeile speziell die Funktionsweise der Funktion, wobei eine leere Zeile verbleibt. Eine ausführliche Erklärung finden Sie hier.
Wenn das Ziel von "doctest" eine einzelne Anweisung ist (= eine einzelne Zeile, die nicht mit einem "endet:"), verwenden Sie die Funktion "doctest" mit dem Namen "run_docstring_examples". Diese Funktion hat drei Argumente. Der erste ist der Name der Funktion, die Sie testen möchten, der zweite ist "global ()" (= eine integrierte Funktion, die die globale Umgebung zurückgibt) und der dritte ist "True" (um anzuzeigen, dass wir eine "ausführliche" Ausgabe wünschen: a Katalog aller Testläufe.). Das Testen einer einzelnen Anweisung heißt übrigens unit test.
Exhaustive unit testing is a hallmark of good program design. --_ Eine gute Programmgestaltung wird durch einen umfassenden Unit-Test garantiert. _
Außerdem können Sie Ihre eigene Testfunktion erstellen oder einen neuen Test erstellen.
Always run these doctests. Submitting an assignment without running doctests even once is practically throwing points away.
Sind Sie im Ernst. Das wusste ich nicht (lacht)
def foo(x):
result = some_function(x)
return result // 5
Wenn Sie nicht wissen, wo der Fehler liegt, selbst wenn Sie den Code schreiben, versuchen Sie, das Ergebnis vorerst zu drucken.
def foo(x):
result = some_function(x)
print('result is', result)
return other_function(result)
Und wenn möglich, vergessen Sie nicht, ein Wort anstelle von "Drucken" hinzuzufügen
print(tmp) # harder to keep track
print('tmp was this:', tmp) # easier
Es ist auch effektiv, es nach der while-Schleife zu setzen
i = 0
while i < n:
i += func(i)
print('i is', i)
Vergessen Sie nicht, den Ausdruck zu entfernen, wenn der Test beendet ist
Long-term debugging
Wenn es um Projekteinheiten geht, ist es manchmal besser, nicht sofort zu debuggen. In einem solchen Fall ist es zweckmäßig, wie folgt vorzugehen
debug = True
def foo(n):
i = 0
while i < n:
i += func(i)
if debug:
print('i is', i)
Wenn Sie nicht möchten, dass die Ergebnisse jedes Mal angezeigt werden, ändern Sie sie in "false". Eine Variable, die dies verwendet, heißt "Flag".
Types of error
Syntax Error Ursache:
File "file name", line number
def incorrect(f)
^
SyntaxError: invalid syntax
^
zeigt Code an, der eine unangemessene Syntax enthält. Es zeigt nicht, was los ist, aber es sagt Ihnen, wo die Ursache liegt. Python sucht zuerst nach diesem "Syntaxfehler", bevor der Code ausgeführt wird.
Indentation Error Ursache:
File "file name", line number
print('improper indentation')
IndentationError: unindent does not match any outer indentation level
Es zeigt, wo falsch eingerückt. Machen Sie eine klare Unterscheidung zwischen Leerzeichen und Registerkartenfunktionalität.
TypeError
Ursache:
TypeError: unsupported operand type(s) for +: 'function' and 'int'
>>> square = 3
>>> square(3)
Traceback (most recent call last):
...
TypeError: 'int' object is not callable`
>>> add(3)
Traceback (most recent call last):
...
TypeError: add expected 2 arguments, got 1
NameError
Ursache: -Verwenden Sie undefinierte Variablen oder Funktionen
File "file name", line number
y = x + 3
NameError: global name 'x' is not defined
Anmerkungen: Der Grund für den "globalen Namen" hier ist, dass Python schließlich den globalen Bereich aus dem lokalen Bereich der Funktion betritt, die den Fehler enthält.
IndexError
Ursache:
File "file name", line number
x[100]
IndexError: tuple index out of range
simple spelling mistakes
hallo
≠ hallo
≠ hallo
. Wenn Sie "NameError" sehen, liegt möglicherweise ein Rechtschreibfehler vor. Oder Sie haben eine Variable oder Funktion mit der falschen Schreibweise definiert.
Missing Parentheses Vergessen, die Klammern usw. zu setzen.
def fun():
return foo(bar() # missing a parenthesis here
fun()
In diesem Fall nennt Python es "SyntaxError" und zeigt auf die Zeile nach der Zeile mit dem Klammerproblem.
Missing close quotes Es ist leicht zu finden, da Python es Ihnen genau sagt.
File "file name", line "number"
return 'hi
^
SyntaxError: EOL while scanning string literal
EOL = "end of line"
= (assignment) vs. == (equality test)
=
wird verwendet, wenn eine Variable übergeben wird, und ==
wird verwendet, um zu überprüfen, ob die Variablen äquivalent sind. Typischer Fehler ist
if x = 3: # when should be "==" instead
Infinite Loops
Die while-Schleife dreht sich so lange, bis die Bedingung erfüllt ist, sodass Sie leicht hineinfallen können.
i = 0
while i < 10:
print(i)
i, n = 0, 0
while i < 10:
print(i)
n += 1
Recommended Posts