Szukaj…


Wprowadzenie

Tutaj w przepełnieniu stosu często widzimy duplikaty mówiące o tych samych błędach: "ImportError: No module named '??????' , SyntaxError: invalid syntax lub NameError: name '???' is not defined . Jest to próba ich ograniczenia i posiadania dokumentacji, z którą można się połączyć.

IndentationErrors (lub indentation SyntaxErrors)

W większości innych języków wcięcia nie są obowiązkowe, ale w Pythonie (i innych językach: wczesne wersje FORTRAN, Makefiles, Whitespace (język ezoteryczny) itp.) Tak nie jest, co może być mylące, jeśli pochodzisz z innego języka, jeśli kopiujesz kod z przykładu na własny lub po prostu, jeśli jesteś nowy.

IndentationError / SyntaxError: nieoczekiwane wcięcie

Ten wyjątek pojawia się, gdy poziom wcięcia wzrasta bez powodu.

Przykład

Nie ma powodu, aby zwiększać poziom tutaj:

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

Tutaj są dwa błędy: ostatni i że wcięcie nie pasuje do żadnego poziomu wcięcia. Jednak pokazany jest tylko jeden:

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 nie pasuje do żadnego zewnętrznego poziomu wcięcia

Wygląda na to, że nie cofnąłeś się całkowicie.

Przykład

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: oczekiwany blok wcięcia

Po dwukropku (a następnie nowej linii) poziom wcięcia musi wzrosnąć. Ten błąd pojawia się, gdy tak się nie stało.

Przykład

if ok:
doStuff()

Uwaga: Za pomocą słów kluczowych pass (sprawia, że absolutnie nic) po prostu położyć if , else , except , class , method lub definition , ale nie mówią, co się stanie, jeśli nazywa / warunek jest spełniony (ale zrobić to później, lub w przypadku except : po prostu nic nie rób):

def foo():
    pass

Wcięcie Błąd: niespójne użycie tabulatorów i spacji we wcięciu

Przykład

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

Jak uniknąć tego błędu

Nie używaj kart. PEP8 , przewodnik po stylu dla Pythona.

  1. Ustaw w edytorze użycie 4 spacji do wcięcia.
  2. Wyszukaj i zamień, aby zastąpić wszystkie tabulatory 4 spacjami.
  3. Upewnij się, że edytor ustawiony jest tak, aby wyświetlał tabulatory jako 8 spacji, abyś mógł łatwo rozpoznać ten błąd i go naprawić.

Zobacz to pytanie, jeśli chcesz dowiedzieć się więcej.

TypeErrors

Te wyjątki powstają, gdy typ jakiegoś obiektu powinien być inny

TypeError: [definicja / metoda] trwa? argumenty pozycyjne, ale? był wręczony

Wywołano funkcję lub metodę z większą lub mniejszą liczbą argumentów niż te, które można zaakceptować.

Przykład

Jeśli podano więcej argumentów:

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

Jeśli podano mniej argumentów:

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

Uwaga : jeśli chcesz użyć nieznanej liczby argumentów, możesz użyć *args lub **kwargs . Zobacz * args i ** kwargs


TypeError: nieobsługiwane typy operandów dla [operand]: '???' i '???'

Niektóre typy nie mogą być obsługiwane razem, w zależności od argumentu.

Przykład

Na przykład: + służy do łączenia i dodawania, ale nie można użyć żadnego z nich dla obu typów. Na przykład próba utworzenia set przez połączenie ( + ing) 'set1' i 'tuple1' daje błąd. Kod:

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

Niektóre typy (np .: int i string ) używają obu + ale do różnych rzeczy:

b = 400 + 'foo'

Lub nie mogą być nawet wykorzystywane do niczego:

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

Ale możesz na przykład dodać float do int :

d = 1 + 1.0

Błąd typu: „???” obiekt nie jest iterowalny / indeksowalny:

Aby obiekt mógł być iterowalny, może pobierać indeksy sekwencyjne, zaczynając od zera, aż indeksy przestaną być prawidłowe i zostanie podniesiony błąd IndexError (Bardziej technicznie: musi mieć metodę __iter__ , która zwraca __iterator__ lub która definiuje metodę __getitem__ co wcześniej wspomniano).

Przykład

Mówimy tutaj, że bar jest zerowym elementem 1. Bzdury:

foo = 1
bar = foo[0]

To jest bardziej dyskretna wersja: W tym przykładzie for prób ustawienia x na amount[0] , pierwszy element w iterowalnym, ale nie może, ponieważ ilość jest int:

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

Błąd typu: „???” obiekt nie jest wywoływalny

Definiujesz zmienną i wywołujesz ją później (np. Co robisz z funkcją lub metodą)

Przykład

foo = "notAFunction"
foo()

Nazwa Błąd: nazwa „???” nie jest zdefiniowany

Jest wywoływany, gdy próbujesz użyć zmiennej, metody lub funkcji, która nie została zainicjowana (przynajmniej wcześniej). Innymi słowy, powstaje, gdy żądana nazwa lokalna lub globalna nie zostanie znaleziona. Możliwe, że źle wpisałeś nazwę obiektu lub zapomniałeś coś import . Może też ma inny zakres. Omówimy je osobnymi przykładami.


Po prostu nie jest nigdzie zdefiniowany w kodzie

Możliwe, że zapomniałeś go zainicjować, szczególnie jeśli jest stały

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

Może to zostanie zdefiniowane później:

baz()

def baz():
    pass

Lub nie było import ed:

#needs import math

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

Zakresy Pythona i reguła LEGB:

Tak zwana reguła LEGB mówi o zakresach języka Python. Jego nazwa oparta jest na różnych zakresach, uporządkowanych według odpowiednich priorytetów:

Local → Enclosed → Global → Built-in.
  • L ocal: Zmienne niezadeklarowane globalnie lub przypisane w funkcji.
  • E nclosing: Zmienne opisane w funkcji, która jest wlana do innej funkcji.
  • G lobal: Zmienne zadeklarowane jako globalne lub przypisane na najwyższym poziomie pliku.
  • B uilt w: Zmienne przydzielony w wbudowanym nazw modułu.

Jako przykład:

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

d jest dostępne, ponieważ pętla for nie oznacza nowego zakresu, ale gdyby tak było, wystąpiłby błąd, a jego zachowanie byłoby podobne do:

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

Python mówi NameError: name 'd' is not defined

Inne błędy

AssertError

Instrukcja assert istnieje w prawie każdym języku programowania. Kiedy to zrobisz:

assert condition

lub:

assert condition, message

Jest to równoważne z tym:

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

Asercje mogą zawierać opcjonalny komunikat i można je wyłączyć po zakończeniu debugowania.

Uwaga : wbudowane debugowanie zmiennej ma wartość True w normalnych okolicznościach, False, gdy wymagana jest optymalizacja (opcja wiersza poleceń -O). Przydziały do debugowania są nielegalne. Wartość wbudowanej zmiennej jest określana przy uruchomieniu interpretera.

KeyboardInterrupt

Błąd zgłaszany, gdy użytkownik naciśnie klawisz przerwania, zwykle Ctrl + C lub del .

ZeroDivisionError

Próbowano obliczyć 1/0 która jest niezdefiniowana. Zobacz ten przykład, aby znaleźć dzielniki liczby:

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)

Podnosi ZeroDivisionError ponieważ pętla for przypisuje tę wartość do x . Zamiast tego powinno być:

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)

Błąd składni na dobrym kodzie

W większości przypadków błąd SyntaxError wskazujący na nieciekawą linię oznacza, że wystąpił problem na linii przed nią (w tym przykładzie jest to brakujący nawias):

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

Zwroty

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

Najczęstszym powodem tego problemu są niedopasowane nawiasy / nawiasy, jak pokazuje przykład.

W Pythonie 3 istnieje jedno ważne zastrzeżenie dotyczące instrukcji print:

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

Ponieważ instrukcja print została zastąpiona funkcją print() , więc chcesz:

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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow