Python Language
Commonwealth-Ausnahmen
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:
print "This line is ok"
print "This line isn't ok"
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:
print "This line is ok"
print "This line isn't ok"
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
def foo():
print "This should be part of foo()"
print "ERROR!"
print "This is not a part of foo()"
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.
- Stellen Sie Ihren Editor so ein, dass er 4 Leerzeichen für die Einrückung verwendet.
- Machen Sie eine Suche und ersetzen Sie sie, um alle Registerkarten durch 4 Leerzeichen zu ersetzen.
- 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:
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
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:
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
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:
>>> 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