Suche…


Einführung

Hier in Stack Overflow sehen wir häufig Duplikate, die über dieselben Fehler sprechen: "ImportError: No module named '??????' , SyntaxError: invalid syntax oder NameError: name '???' is not defined . Dies ist ein Versuch, sie zu reduzieren und Dokumentation zu haben, auf die verlinkt werden kann.

Einrückungsfehler (oder EinzugssyntaxErrors)

In den meisten anderen Sprachen ist die Einrückung nicht zwingend, sondern in Python (und anderen Sprachen: frühe Versionen von FORTRAN, Makefiles, Whitespace (esoterische Sprache) usw.). Dies ist jedoch nicht der Fall. wenn Sie Code von einem Beispiel zu Ihrem eigenen kopieren oder einfach, wenn Sie neu sind.

IndentationError / SyntaxError: unerwarteter Einzug

Diese Ausnahme wird ausgelöst, wenn die Einrückung ohne Grund steigt.

Beispiel

Es gibt keinen Grund, das Niveau hier zu erhöhen:

Python 2.x 2.0 2.7
 print "This line is ok"
     print "This line isn't ok"
Python 3.x 3.0
 print("This line is ok")
     print("This line isn't ok")

Hier gibt es zwei Fehler: den letzten und dass die Einrückung keiner Einrückungsebene entspricht. Es wird jedoch nur eine gezeigt:

Python 2.x 2.0 2.7
 print "This line is ok"
  print "This line isn't ok"
Python 3.x 3.0
 print("This line is ok")
  print("This line isn't ok")

IndentationError / SyntaxError: unindent passt zu keiner äußeren Einrückungsebene

Sieht aus, als ob Sie nicht vollständig entrückt wurden.

Beispiel

Python 2.x 2.0 2.7
def foo():
    print "This should be part of foo()"
   print "ERROR!"
print "This is not a part of foo()"
Python 3.x 3.0
 print("This line is ok")
  print("This line isn't ok")

IndentationError: Ein eingerückter Block wurde erwartet

Nach einem Doppelpunkt (und dann einer neuen Zeile) muss die Einrückungsebene erhöht werden. Dieser Fehler wird ausgelöst, wenn dies nicht der Fall ist.

Beispiel

if ok:
doStuff()

Anmerkung : Verwenden Sie das Schlüsselwort pass (das macht absolut nichts), um einfach eine if , else , except class , method oder definition aber nicht zu sagen, was passiert, wenn der Aufruf / condition true ist (tun Sie es aber später oder im Fall von except : einfach nichts tun):

def foo():
    pass

IndentationError: Inkonsistente Verwendung von Tabulatoren und Leerzeichen beim Einzug

Beispiel

def foo():
    if ok:
      return "Two != Four != Tab"
        return "i dont care i do whatever i want"

So vermeiden Sie diesen Fehler

Verwenden Sie keine Tabs. Es wird von PEP8 , dem Style Guide für Python, abgeraten.

  1. Stellen Sie Ihren Editor so ein, dass er 4 Leerzeichen für die Einrückung verwendet.
  2. Machen Sie eine Suche und ersetzen Sie sie, um alle Registerkarten durch 4 Leerzeichen zu ersetzen.
  3. Stellen Sie sicher, dass Ihr Editor so eingestellt ist, dass die Registerkarten als 8 Leerzeichen angezeigt werden, sodass Sie den Fehler leicht erkennen und beheben können.

Sehen Sie sich diese Frage an, wenn Sie mehr erfahren möchten.

TypeErrors

Diese Ausnahmen werden verursacht, wenn der Typ eines Objekts unterschiedlich sein sollte

TypeError: [Definition / Methode] dauert? Positionsargumente aber? wurde gegeben

Eine Funktion oder Methode wurde mit mehr (oder weniger) Argumenten als denjenigen aufgerufen, die sie akzeptieren kann.

Beispiel

Wenn mehr Argumente angegeben werden:

def foo(a): return a
foo(a,b,c,d) #And a,b,c,d are defined

Wenn weniger Argumente angegeben werden:

def foo(a,b,c,d): return a += b + c + d
foo(a) #And a is defined

Hinweis : Wenn Sie eine unbekannte Anzahl von Argumenten verwenden möchten, können Sie *args oder **kwargs . Siehe * args und ** kwargs


TypeError: nicht unterstützte Operandentypen für [Operand]: '???' und '???'

Einige Typen können je nach Operand nicht zusammen betrieben werden.

Beispiel

Zum Beispiel: + wird zum Verketten und Hinzufügen verwendet, aber Sie können keine davon für beide Typen verwenden. Um zum Beispiel eine machen versuchen , set durch die Verkettung ( + ing) 'set1' und 'tuple1' gibt den Fehler. Code:

set1, tuple1 = {1,2}, (3,4)
a = set1 + tuple1

Einige Typen (zB: int und string ) verwenden beide + jedoch für verschiedene Dinge:

b = 400 + 'foo'

Oder sie können nicht einmal für irgendetwas verwendet werden:

c = ["a","b"] - [1,2]

Sie können aber beispielsweise einen float zu einem int hinzufügen:

d = 1 + 1.0

TypeError: '???' Objekt ist nicht iterierbar / subskribierbar:

Für ein Objekt iterable sein kann sequentielle Indizes nimmt von Null ausgehend , bis der Indizes nicht mehr gültig ist , und ein IndexError angehoben wird (Technisch: es ist eine haben , hat __iter__ Methode , die ein zurückgibt __iterator__ , oder das eines definiert __getitem__ Verfahren , das tut was zuvor erwähnt wurde).

Beispiel

Hier sagen wir, dass bar der nullte Punkt von 1. ist.

foo = 1
bar = foo[0]

Dies ist eine diskrete Version: In diesem Beispiel for Versuche einstellen x amount[0] , das erste Element in einem abzählbaren , aber es kann nicht , weil Menge ist ein int:

amount = 10
for x in amount: print(x)

TypeError: '???' Objekt ist nicht aufrufbar

Sie definieren eine Variable und rufen sie später auf (wie bei einer Funktion oder Methode).

Beispiel

foo = "notAFunction"
foo()

NameFehler: Name "???" ist nicht definiert

Wird ausgelöst, wenn Sie versucht haben, eine Variable, Methode oder Funktion zu verwenden, die nicht initialisiert wurde (zumindest nicht vorher). Mit anderen Worten, es wird ausgelöst, wenn ein angeforderter lokaler oder globaler Name nicht gefunden wird. Möglicherweise haben Sie den Namen des Objekts falsch geschrieben oder vergessen, etwas zu import . Vielleicht auch in einem anderen Bereich. Wir werden diese mit separaten Beispielen behandeln.


Es ist einfach nirgendwo im Code definiert

Es ist möglich, dass Sie die Initialisierung vergessen haben, insbesondere wenn es sich um eine Konstante handelt

foo   # This variable is not defined
bar() # This function is not defined

Vielleicht ist es später definiert:

baz()

def baz():
    pass

Oder es wurde nicht import :

#needs import math

def sqrt():
    x = float(input("Value: "))
    return math.sqrt(x)

Python-Bereiche und die LEGB-Regel:

Die sogenannte LEGB-Regel spricht über die Python-Bereiche. Der Name basiert auf den verschiedenen Bereichen, sortiert nach den entsprechenden Prioritäten:

Local → Enclosed → Global → Built-in.
  • L ocal: Variablen, die nicht global deklariert oder in einer Funktion zugewiesen sind.
  • E nclosing: Variablen in einer Funktion definiert , die innerhalb einer anderen Funktion gewickelt ist.
  • G lobale: Variablen erklärt global oder auf der obersten Ebene einer Datei zugeordnet.
  • B uilt-in: Variablen vorbelegt im eingebauten Namen Modul.

Als Beispiel:

for i in range(4):
    d = i * 2
print(d)

d ist zugänglich, weil die for Schleife keinen neuen Gültigkeitsbereich markiert, aber wenn dies der Fall wäre, hätten wir einen Fehler und sein Verhalten wäre ähnlich:

def noaccess():
    for i in range(4):
        d = i * 2
noaccess()
print(d)

Python sagt, dass NameError: name 'd' is not defined

Andere Fehler

AssertError

Die assert Anweisung existiert in fast jeder Programmiersprache. Wenn Sie das tun:

assert condition

oder:

assert condition, message

Das ist gleichbedeutend mit:

if __debug__:
    if not condition: raise AssertionError(message)

Zusicherungen können eine optionale Nachricht enthalten und Sie können sie deaktivieren, wenn Sie mit dem Debuggen fertig sind.

Hinweis : Die eingebaute Variable debug ist unter normalen Umständen True, False, wenn die Optimierung angefordert wird (Befehlszeilenoption -O). Zuweisungen zum Debuggen sind illegal. Der Wert für die integrierte Variable wird beim Start des Interpreters festgelegt.

KeyboardInterrupt

Fehler ausgelöst , wenn der Benutzer die Interrupt - Taste drückt, normalerweise Strg + C oder del.

ZeroDivisionError

Sie haben versucht, 1/0 zu berechnen, das nicht definiert ist. Sehen Sie sich dieses Beispiel an, um die Teiler einer Zahl zu finden:

Python 2.x 2.0 2.7
div = float(raw_input("Divisors of: "))
for x in xrange(div+1): #includes the number itself and zero
    if div/x == div//x:
        print x, "is a divisor of", div
Python 3.x 3.0
div = int(input("Divisors of: "))
for x in range(div+1): #includes the number itself and zero
    if div/x == div//x:
        print(x, "is a divisor of", div)

ZeroDivisionError da die for Schleife diesen Wert x zuordnet. Stattdessen sollte es sein:

Python 2.x 2.0 2.7
div = float(raw_input("Divisors of: "))
for x in xrange(1,div+1): #includes the number itself but not zero
    if div/x == div//x:
        print x, "is a divisor of", div
Python 3.x 3.0
div = int(input("Divisors of: "))
for x in range(1,div+1): #includes the number itself but not zero
    if div/x == div//x:
        print(x, "is a divisor of", div)

Syntaxfehler bei gutem Code

Die grobe Mehrheit der Zeit, zu der ein SyntaxError auf eine uninteressante Zeile verweist, bedeutet, dass ein Problem in der Zeile davor vorliegt (in diesem Beispiel fehlt eine Klammer):

def my_print():
    x = (1 + 1
    print(x)

Kehrt zurück

  File "<input>", line 3
    print(x)
        ^
SyntaxError: invalid syntax

Der häufigste Grund für dieses Problem sind nicht übereinstimmende Klammern / Klammern, wie das Beispiel zeigt.

In Python 3 gibt es einen wichtigen Vorbehalt für Druckanweisungen:

Python 3.x 3.0
 >>> print "hello world"
  File "<stdin>", line 1
    print "hello world"
                      ^
SyntaxError: invalid syntax

Da die Anweisung print durch die Funktion print() , möchten Sie:

print("hello world")  # Note this is valid for both Py2 & Py3


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow