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:

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")

Qui ci sono due errori: l'ultimo e che il rientro non corrisponde a nessun livello di indentazione. Tuttavia ne viene mostrato solo uno:

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 non corrisponde a nessun livello di indentazione esterno

Sembra che tu non abbia distrutto completamente.

Esempio

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: 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.

  1. Imposta il tuo editor per utilizzare 4 spazi per il rientro.
  2. Fai una ricerca e sostituisci per sostituire tutte le schede con 4 spazi.
  3. 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:

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)

Solleva ZeroDivisionError perché il ciclo for assegna quel valore a x . Invece dovrebbe essere:

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)

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:

Python 3.x 3.0
 >>> 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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow