Введение

Примеры

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.

  1. Установите редактор использовать 4 пробелов для отступа.
  2. Сделайте поиск и замените, чтобы заменить все вкладки с 4 пробелами.
  3. Убедитесь , что ваш редактор настроен на отображение вкладок в 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

Синтаксис

Параметры

Примечания