Python Language
Eccezioni del Commonwealth
Ricerca…
introduzione
Qui in Stack Overflow spesso vediamo duplicati che parlano degli stessi errori: "ImportError: No module named '??????'
, SyntaxError: invalid syntax
o NameError: name '???' is not defined
tratta di uno sforzo per ridurli e avere una documentazione a cui collegarsi.
IndentazioneErrori (o indentazione SintassiErrori)
Nella maggior parte delle altre lingue il rientro non è obbligatorio, ma in Python (e in altre lingue: prime versioni di FORTRAN, Makefile, Whitespace (linguaggio esoterico), ecc.) Non è così, cosa può essere fonte di confusione se vieni da un'altra lingua, se stavi copiando il codice da un esempio al tuo, o semplicemente se sei nuovo.
IndentationError / SyntaxError: indent inaspettato
Questa eccezione viene sollevata quando il livello di indentazione aumenta senza motivo.
Esempio
Non c'è motivo di aumentare il livello qui:
print "This line is ok"
print "This line isn't ok"
print("This line is ok")
print("This line isn't ok")
Qui ci sono due errori: l'ultimo e che il rientro non corrisponde a nessun livello di indentazione. Tuttavia ne viene mostrato solo uno:
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 non corrisponde a nessun livello di indentazione esterno
Sembra che tu non abbia distrutto completamente.
Esempio
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: previsto un blocco rientrato
Dopo i due punti (e poi una nuova riga) il livello di indentazione deve aumentare. Questo errore viene generato quando ciò non è accaduto.
Esempio
if ok:
doStuff()
Nota : usa la parola chiave pass
(che non fa assolutamente nulla) per mettere un if
, else
, except
, class
, method
o definition
ma non dire cosa succederà se chiamato / condizione è vera (ma fallo più tardi, o nel caso di except
: non fare niente):
def foo():
pass
IndentationError: uso incoerente di tabulazioni e spazi in indentazione
Esempio
def foo():
if ok:
return "Two != Four != Tab"
return "i dont care i do whatever i want"
Come evitare questo errore
Non usare le schede. È scoraggiato da PEP8
, la guida di stile per Python.
- Imposta il tuo editor per utilizzare 4 spazi per il rientro.
- Fai una ricerca e sostituisci per sostituire tutte le schede con 4 spazi.
- Assicurati che il tuo editor sia impostato per visualizzare le schede come 8 spazi, in modo che tu possa facilmente realizzare quell'errore e correggerlo.
Vedi questa domanda se vuoi saperne di più.
TypeErrors
Queste eccezioni sono causate quando il tipo di alcuni oggetti dovrebbe essere diverso
TypeError: [definizione / metodo] richiede? argomenti posizionali ma? Venne dato
Una funzione o un metodo è stato chiamato con più (o meno) argomenti rispetto a quelli che può accettare.
Esempio
Se vengono forniti più argomenti:
def foo(a): return a
foo(a,b,c,d) #And a,b,c,d are defined
Se vengono forniti meno argomenti:
def foo(a,b,c,d): return a += b + c + d
foo(a) #And a is defined
Nota : se si desidera utilizzare un numero sconosciuto di argomenti, è possibile utilizzare *args
o **kwargs
. Vedi * args e ** kwargs
TypeError: tipi di operando non supportati per [operando]: '???' e '???'
Alcuni tipi non possono essere gestiti insieme, a seconda dell'operando.
Esempio
Ad esempio: +
è usato per concatenare e aggiungere, ma non puoi usarne nessuno per entrambi i tipi. Ad esempio, provare a creare un set
concatenando ( +
ing) 'set1'
e 'tuple1'
restituisce l'errore. Codice:
set1, tuple1 = {1,2}, (3,4)
a = set1 + tuple1
Alcuni tipi (es .: int
e string
) usano entrambi +
ma per cose diverse:
b = 400 + 'foo'
Oppure potrebbero non essere nemmeno usati per nulla:
c = ["a","b"] - [1,2]
Ma puoi ad esempio aggiungere un float
a un int
:
d = 1 + 1.0
TypeError: '???' l'oggetto non è iterable / subscriptable:
Perché un oggetto sia iterabile può prendere indici sequenziali a partire da zero fino a quando gli indici non sono più validi e viene sollevato un IndexError
(Più tecnicamente: deve avere un metodo __iter__
che restituisce un __iterator__
, o che definisce un metodo __getitem__
che fa ciò che è stato precedentemente menzionato).
Esempio
Qui stiamo dicendo che la bar
è l'oggetto zeroth di 1. Sciocchezze:
foo = 1
bar = foo[0]
Questa è una versione più discreta: In questo esempio for
tentativi per impostare x
per amount[0]
, il primo elemento in un iterabile ma non può perché quantità è un int:
amount = 10
for x in amount: print(x)
TypeError: '???' l'oggetto non è chiamabile
Stai definendo una variabile e chiamandola in un secondo momento (come quello che fai con una funzione o un metodo)
Esempio
foo = "notAFunction"
foo()
NameError: name '???' non è definito
Viene generato quando si tenta di utilizzare una variabile, un metodo o una funzione non inizializzata (almeno non prima). In altre parole, viene generato quando non viene trovato un nome locale o globale richiesto. È possibile che tu abbia sbagliato il nome dell'oggetto o dimenticato di import
qualcosa. Inoltre forse è in un altro ambito. Copriremo quelli con esempi separati.
Semplicemente non è definito da nessuna parte nel codice
È possibile che tu abbia dimenticato di inizializzarlo, specialmente se è una costante
foo # This variable is not defined
bar() # This function is not defined
Forse è definito più tardi:
baz()
def baz():
pass
O non è stato import
:
#needs import math
def sqrt():
x = float(input("Value: "))
return math.sqrt(x)
Scopi Python e la regola LEGB:
La cosiddetta regola LEGB parla degli ambiti Python. Il suo nome si basa sui diversi ambiti, ordinati dalle priorità corrispondenti:
Local → Enclosed → Global → Built-in.
- L ocal: variabili non dichiarate globali o assegnate in una funzione.
- E nclosing: variabili definite in una funzione che è racchiusa in un'altra funzione.
- G lobal: variabili dichiarate globali o assegnate al livello superiore di un file.
- B uilt-in: variabili preassegnate nel modulo nomi incorporato.
Come esempio:
for i in range(4):
d = i * 2
print(d)
d
è accessibile perché il ciclo for
non segna un nuovo scope, ma se lo facesse avremmo un errore e il suo comportamento sarebbe simile a:
def noaccess():
for i in range(4):
d = i * 2
noaccess()
print(d)
Python dice NameError: name 'd' is not defined
Altri errori
AssertError
assert
dichiarazione esiste in quasi ogni linguaggio di programmazione. Quando lo fai:
assert condition
o:
assert condition, message
È equivalente a questo:
if __debug__:
if not condition: raise AssertionError(message)
Le asserzioni possono includere un messaggio opzionale e puoi disabilitarle quando hai finito il debug.
Nota : il debug della variabile integrato è True in circostanze normali, False quando viene richiesta l'ottimizzazione (opzione riga di comando -O). Le assegnazioni di debug sono illegali. Il valore per la variabile built-in viene determinato all'avvio dell'interprete.
KeyboardInterrupt
Errore generato quando l'utente preme il tasto interrupt, normalmente Ctrl + C o del .
ZeroDivisionError
Hai provato a calcolare 1/0
che non è definito. Vedi questo esempio per trovare i divisori di un numero:
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)
Solleva ZeroDivisionError
perché il ciclo for
assegna quel valore a x
. Invece dovrebbe essere:
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)
Errore di sintassi su buon codice
La maggior parte delle volte un SyntaxError che punta a una linea non interessante significa che c'è un problema sulla linea (in questo esempio, è una parentesi mancante):
def my_print():
x = (1 + 1
print(x)
ritorna
File "<input>", line 3
print(x)
^
SyntaxError: invalid syntax
Il motivo più comune di questo problema è parentesi / parentesi non corrispondenti, come mostra l'esempio.
C'è un avvertimento importante per le dichiarazioni di stampa in Python 3:
>>> print "hello world"
File "<stdin>", line 1
print "hello world"
^
SyntaxError: invalid syntax
Perché la dichiarazione di print
stata sostituita con la funzione print()
, quindi si desidera:
print("hello world") # Note this is valid for both Py2 & Py3