Python Language
Wyjątki Wspólnoty Narodów
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:
print "This line is ok"
print "This line isn't ok"
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:
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 nie pasuje do żadnego zewnętrznego poziomu wcięcia
Wygląda na to, że nie cofnąłeś się całkowicie.
Przykład
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: 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.
- Ustaw w edytorze użycie 4 spacji do wcięcia.
- Wyszukaj i zamień, aby zastąpić wszystkie tabulatory 4 spacjami.
- 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:
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)
Podnosi ZeroDivisionError
ponieważ pętla for
przypisuje tę wartość do x
. Zamiast tego powinno być:
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)
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:
>>> 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