Fehlerklassifizierung (python3.x) und Debugging-Hinweise

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 " enthält den Namen der Datei, die den Fehler enthält, wo (die Zeile) der Fehler ist und den Fehler. Die drei vorhandenen Funktionsnamen werden im Format "Datei" ", Zeile , in " ausgedrückt. Das zweite 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

Lassen Sie es uns vorerst mit Doctest verschieben

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)

Überprüfen Sie den Fortschritt, indem Sie print () in die wichtigen Punkte einfügen

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

Häufige Fehler

simple spelling mistakes

hallo hallohallo. 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

Fehlerklassifizierung (python3.x) und Debugging-Hinweise
pytube Ausführung und Fehler
Golang Fehler und Panik
Bericht über das Debuggen und Testen
Hinweise zur Funktion und Rückverfolgung
Anmerkungen zu * args und ** kargs
Unterschied zwischen Regression und Klassifikation
Anmerkungen zu Pyenv und Atom