Введение
Примеры
IndentationErrors (или отступ SyntaxErrors)
В большинстве других языков отступ не является обязательным, но в Python (и других языках: ранних версиях FORTRAN, Makefiles, Whitespace (эзотерический язык) и т. Д.) Это не так, что может сбивать с толку, если вы пришли с другого языка если вы копировали код из примера в свой собственный, или просто если вы новичок.
IndentationError / SyntaxError: неожиданный отступ
Это исключение возникает, когда уровень отступа увеличивается без причины.
пример
Там нет причин для повышения уровня здесь:
print "Эта строка в порядке" print "Эта строка не в порядке" print(«Эта строка не в порядке») print(«Эта строка не в порядке»)
Здесь есть две ошибки: последняя и что отступ не соответствует ни одному уровню отступа. Однако показано только одно:
print "Эта строка в порядке" print "Эта строка не в порядке" print(«Эта строка не в порядке») print(«Эта строка не в порядке»)
IndentationError / SyntaxError: unindent не соответствует ни одному внешнему уровню отступа
Похоже, вы не удалили полностью.
пример
def foo (): print "Это должно быть частью foo ()" print "ERROR!" print "Это не часть foo ()" print(«Эта строка не в порядке») print(«Эта строка не в порядке»)
IndentationError: ожидается блок с отступом
После двоеточия (а затем и новой строки) уровень отступа должен увеличиться. Эта ошибка возникает, когда этого не произошло.
пример
if ok:
doStuff()
Примечание: Используйте ключевое слово pass
(что не делает абсолютно ничего) просто Погружает if
, else
, за except
, class
, method
или definition
, но не сказать , что произойдет , если называется / условие истинно (но сделать это позже, или в случае за except
: просто ничего не делать):
def foo():
pass
IndentationError: противоречивое использование табуляции и пробелов в отступе
пример
def foo():
if ok:
return "Two != Four != Tab"
return "i dont care i do whatever i want"
Как избежать этой ошибки
Не используйте вкладки. Это обескураживает PEP8
, в стиль руководства для Python.
- Установите редактор использовать 4 пробелов для отступа.
- Сделайте поиск и замените, чтобы заменить все вкладки с 4 пробелами.
- Убедитесь , что ваш редактор настроен на отображение вкладок в 8 пробелов, так что вы можете легко реализовать эту ошибку и исправить ее.
Смотрите этот вопрос , если вы хотите , чтобы узнать больше.
TypeErrors
Эти исключения возникают, когда тип какого-либо объекта должен быть другим
Ошибка типа: [определение / метод] занимает? позиционные аргументы, но? был дан
Функция или метод вызывались с большим (или меньшим) количеством аргументов, чем те, которые он может принять.
пример
Если дано больше аргументов:
def foo(a): return a
foo(a,b,c,d) #And a,b,c,d are defined
Если дано меньше аргументов:
def foo(a,b,c,d): return a += b + c + d
foo(a) #And a is defined
Примечание: если вы хотите использовать неизвестное количество аргументов, вы можете использовать *args
или **kwargs
.См * арг и ** kwargs
Ошибка типа: неподдерживаемые типы операндов для [операнд]: '???' а также '???'
Некоторые типы не могут работать вместе, в зависимости от операнда.
пример
Например: +
используется для конкатенации и добавить, но вы не можете использовать любой из них для обоих типов. Например, пытаясь сделать set
путем конкатенации ( +
ю) 'set1'
и 'tuple1'
дает ошибку. Код:
set1, tuple1 = {1,2}, (3,4)
a = set1 + tuple1
Некоторые виды (например: int
и string
) используют как +
, но и для различных вещей:
b = 400 + 'foo'
Или они могут даже не использоваться ни для чего:
c = ["a","b"] - [1,2]
Но вы можете, например , добавить float
к int
:
d = 1 + 1.0
Ошибка типа: '???' объект не повторяем / подписан:
Для объекта быть итерацией он может принимать последовательные индексы , начиная с нуля , пока индексы больше не действительны и IndexError
поднято (Технически: он должен иметь __iter__
метод , который возвращает __iterator__
, или который определяет __getitem__
метод , который делает что было упомянуто ранее).
пример
Здесь мы говорим , что bar
является нулевым пунктом 1. Глупости:
foo = 1
bar = foo[0]
Это более дискретный вариант: В этом примере for
пытается установить x
, чтобы amount[0]
, первый элемент в качестве итератора , но он не может , поскольку количество представляет собой INT:
amount = 10
for x in amount: print(x)
Ошибка типа: '???' объект не вызывается
Вы определяете переменную и вызываете ее позже (например, что вы делаете с функцией или методом)
пример
foo = "notAFunction"
foo()
NameError: name '???' не определено
Возникает, когда вы пытались использовать переменную, метод или функцию, которые не инициализированы (по крайней мере, до этого). Другими словами, оно возникает, когда запрошенное локальное или глобальное имя не найдено. Вполне возможно , что вы орфографические ошибки имени объекта или забыли import
что - то. Также возможно это в другом объеме. Мы рассмотрим их на отдельных примерах.
Это просто не определено нигде в коде
Возможно, вы забыли инициализировать его, особенно если это константа
foo # This variable is not defined
bar() # This function is not defined
Может быть, это будет определено позже:
baz()
def baz():
pass
Или это не import
изд:
#needs import math
def sqrt():
x = float(input("Value: "))
return math.sqrt(x)
Области применения Python и правило LEGB:
В так называемом правиле LEGB говорится о возможностях Python. Его название основано на различных областях, упорядоченных по соответствующим приоритетам:
Local → Enclosed → Global → Built-in.
- L OCAL: Переменные не объявляются глобальные или назначены в функции.
- Е nclosing: Переменные , определенные в функции , которая намотана внутри другой функции.
- G ЛОБАЛЬНЫЕ: Переменные , объявленные глобальные или назначены на верхнем уровне файла.
- B uilt в: Переменные в наперед заданные имена встроенных модуля.
В качестве примера:
for i in range(4):
d = i * 2
print(d)
d
является доступным , поскольку for
цикла не ознаменует новую сферу, но если это так, то мы имели бы ошибку и его поведение будет выглядеть следующим образом:
def noaccess():
for i in range(4):
d = i * 2
noaccess()
print(d)
Python говорит NameError: name 'd' is not defined
Другие ошибки
AssertError
assert
утверждение существует практически в каждом языке программирования. Когда вы делаете:
assert condition
или же:
assert condition, message
Это эквивалентно этому:
if __debug__:
if not condition: raise AssertionError(message)
Утверждения могут включать необязательные сообщения, и вы можете отключить их, когда закончите отладку.
Примечание: встроенная переменная отладки Правда при нормальных условиях, Ложные при оптимизации запрашиваемых (опция командной строки -O). Задания для отладки являются незаконными. Значение для встроенной переменной определяется при запуске интерпретатора.
KeyboardInterrupt
Ошибка возникает , когда пользователь нажимает клавишу прерывания обычно Ctrl + C или дель.
ZeroDivisionError
Вы пытались вычислить 1/0
, который не определен. Посмотрите этот пример, чтобы найти делители числа:
div = float (raw_input ("Divisors of:")) для x в xrange (div + 1): # включает само число и ноль, если div / x == div // x: print x, "является делителем" Div div = int (input ("Divisors of:")) для x в диапазоне (div + 1): # включает само число и ноль, если div / x == div // x: print(x, "является делителем", див) Он вызывает `ZeroDivisionError`, потому что цикл` for` присваивает это значение `x`. Вместо этого должно быть: div = float (raw_input ("Divisors of:")) для x в xrange (1, div + 1): # включает в себя само число, но не ноль, если div / x == div // x: print x, "является делитель", див div = int (input ("Divisors of:")) для x в диапазоне (1, div + 1): # включает само число, но не ноль, если div / x == div // x: print(x, "is делитель", div)
Синтаксическая ошибка в хорошем коде
В большинстве случаев ошибка SyntaxError, указывающая на неинтересную строку, означает, что в строке перед ней есть проблема (в данном примере это пропущенная скобка):
def my_print():
x = (1 + 1
print(x)
Возвращает
File "<input>", line 3
print(x)
^
SyntaxError: invalid syntax
Как показано в примере, наиболее распространенной причиной этой проблемы являются несоответствующие скобки / скобки.
В Python 3 есть одно важное предупреждение для операторов печати:
>>> распечатать "Привет мир" Файл " ", строка 1 print" hello world "^ SyntaxError: неверный синтаксис, поскольку [оператор` print` был заменен функцией `print()`] (https://docs.python.org/3/whatsnew/3.0.html # print-is-a-function), так что вы хотите: print("hello world") # Обратите внимание, что это справедливо как для Py2, так и для Py3