// каталог ошибок · 29 сообщений

Ошибки имён, типов и вызовов в Python: NameError, TypeError, AttributeError

Программа запустилась, но споткнулась о значение: имя не найдено, к строке прибавили число, вызвали то, что не является функцией, обратились к методу, которого у объекта нет. NameError один дал 18% ошибок новичков в тренажёре Koddo, а TypeError и AttributeError — самое частое семейство после запуска программы.

Свой трейсбек удобнее вставить в расшифровщик: он сам найдёт нужное сообщение и подставит имена из твоего кода в объяснение. Ниже — все сообщения семейства по порядку, у каждого постоянная ссылка.

Имена, типы и вызовы: NameError, TypeError, AttributeError 29

NameError: name 'total' is not defined

имя total не определено

Python встретил имя total, которому ещё ничего не присвоено в этом месте программы.

частые причины

  • Опечатка или другой регистр: Total и total это разные имена.
  • Переменная создаётся ниже по коду или внутри другой функции.
  • Текст написан без кавычек: print(привет) вместо print("привет").
  • Модуль не импортирован: math.sqrt(x) без import math.
  • Функция вызвана раньше, чем объявлена через def.

как починить

Найди, где total получает значение, и убедись, что это происходит раньше и в той же области видимости. Если Python предлагает похожее имя после «Did you mean», обычно это и есть опечатка.

было

name = input()
print(nmae)

стало

name = input()
print(name)

NameError и области видимости в справочнике

NameError

ошибка имени

Python не нашёл имя, к которому обращается код.

частые причины

  • Опечатка в имени.
  • Имя определено позже или в другой функции.

как починить

Проверь написание и место, где имя получает значение.

NameError и области видимости в справочнике

UnboundLocalError: cannot access local variable 'count' where it is not associated with a value

локальная переменная count используется до присваивания

Внутри функции переменной count где-то присваивается значение, поэтому Python считает её локальной. А читается она раньше, чем это присваивание выполнилось.

частые причины

  • count += 1 внутри функции, а count создан снаружи.
  • Переменная присваивается только в одной ветке if, а читается после него.

как починить

Передай значение параметром и верни результат через return. Если это счётчик, объяви global count в начале функции, но лучше обойтись без глобальных переменных.

было

count = 0
def bump():
    count += 1

стало

def bump(count):
    return count + 1
count = bump(0)

NameError и области видимости в справочнике

TypeError: 'int' object is not iterable

объект типа int нельзя перебрать

В for, list(), sum() или распаковке оказалось одиночное значение типа int, а нужна коллекция или строка.

частые причины

  • Цикл по числу: for i in 5 вместо for i in range(5).
  • Функция вернула None (нет return), а результат перебирают.
  • В sum() или max() передано число вместо списка.

как починить

Перебирай коллекцию или range(n). Если тип NoneType, проверь, что функция возвращает значение через return.

было

for i in 5:
    print(i)

стало

for i in range(5):
    print(i)

TypeError и ValueError в справочнике

TypeError: argument of type 'int' is not iterable

аргумент типа int нельзя перебрать

Оператор in справа требует строку, список или другую коллекцию, а стоит значение типа int.

частые причины

  • "7" in 2007: число вместо строки.
  • Переменная перезаписана числом или None.

как починить

Приведи значение к строке или списку: "7" in str(year).

было

if "7" in 2007:

стало

if "7" in str(2007):

TypeError и ValueError в справочнике

TypeError: 'int' object is not subscriptable

к объекту типа int нельзя обратиться по индексу

Квадратные скобки [...] применены к значению типа int, у которого нет элементов.

частые причины

  • Переменная перезаписана числом, а раньше была списком.
  • Функция вернула None (тип NoneType): нет return или return без значения.
  • Скобки перепутаны: func[1] вместо func(1).

как починить

Проверь, что в переменной именно список, строка или словарь. Для NoneType найди функцию, которая должна была вернуть значение.

было

n = 5
print(n[0])

стало

digits = str(5)
print(digits[0])

TypeError и ValueError в справочнике

TypeError: 'int' object is not callable

объект типа int нельзя вызвать

После значения типа int стоят круглые скобки, а вызывать можно только функции и классы.

частые причины

  • Переменная названа как встроенная функция: sum = 0, а потом sum(items).
  • Пропущен оператор: 2(x + 1) вместо 2 * (x + 1).
  • Скобки перепутаны: items(0) вместо items[0].

как починить

Не называй переменные sum, list, max, str, input. Между числом и скобкой пиши *. Индекс бери квадратными скобками.

было

sum = 0
print(sum([1, 2]))

стало

total = 0
print(sum([1, 2]))

TypeError и ValueError в справочнике

TypeError: unsupported operand type(s) for +: 'int' and 'str'

оператор + не поддерживает типы int и str

Python не умеет применять + к значениям типов int и str вместе.

частые причины

  • input() возвращает строку, а к ней прибавляют число.
  • Один из операндов None: функция ничего не вернула.
  • Складываются список и число.

как починить

Приведи типы явно: int(input()) для чисел, str(n) для склейки текста.

было

age = input()
print(age + 1)

стало

age = int(input())
print(age + 1)

преобразование типов в справочнике

TypeError: can only concatenate str (not "int") to str

к str можно присоединить только str, а не int

Оператор + для str означает склейку, и второй операнд тоже должен быть str, а не int.

частые причины

  • Строка + число при выводе: "Возраст: " + 25.
  • Список + одиночный элемент вместо append.

как починить

Собирай текст f-строкой: f"Возраст: {age}". Элемент в список добавляй через append.

было

print("Возраст: " + 25)

стало

print(f"Возраст: {25}")

TypeError и ValueError в справочнике

TypeError: '<' not supported between instances of 'str' and 'int'

сравнение < не поддерживается между str и int

Сравнивать через < можно значения одного рода, а здесь str и int.

частые причины

  • Число из input() не приведено к int и сравнивается с числом.
  • В списке смешаны строки и числа, и его сортируют.

как починить

Приведи оба значения к одному типу до сравнения.

было

age = input()
if age < 18:

стало

age = int(input())
if age < 18:

преобразование типов в справочнике

TypeError: greet() missing 1 required positional argument: 'name'

при вызове greet() не хватает обязательных аргументов: 'name'

Функция greet объявлена с параметрами, а при вызове им не передали значения: не хватает 1.

частые причины

  • Функция вызвана без аргументов или с меньшим числом, чем в def.
  • Метод класса вызван через класс, а не через объект.

как починить

Передай значения для каждого параметра из def или задай параметрам значения по умолчанию.

было

def greet(name):
    print("Привет,", name)
greet()

стало

def greet(name):
    print("Привет,", name)
greet("Аня")

функции в справочнике

TypeError: greet() takes 1 positional argument but 2 were given

greet() принимает 1 аргумента, а передано 2

В вызов greet передали больше значений, чем параметров в её объявлении.

частые причины

  • Лишний аргумент при вызове.
  • В методе класса забыт параметр self: Python передаёт объект первым аргументом.

как починить

Сверь вызов с def. Для метода класса первым параметром напиши self.

было

class Cat:
    def meow():
        print("мяу")
Cat().meow()

стало

class Cat:
    def meow(self):
        print("мяу")
Cat().meow()

функции в справочнике

TypeError: object of type 'int' has no len()

у объекта типа int нет длины

len() считает элементы строки, списка или словаря, а значение типа int из элементов не состоит.

частые причины

  • len(12345): длина числа. Сначала преврати его в строку.
  • Переменная перезаписана числом или None.

как починить

Для числа: len(str(n)). Иначе проверь, что в переменной коллекция.

было

print(len(12345))

стало

print(len(str(12345)))

TypeError и ValueError в справочнике

TypeError: list indices must be integers or slices, not str

индексы list должны быть целыми числами или срезами, а не str

К списку обратились как к словарю: в квадратных скобках стоит str, а список принимает только номер позиции.

частые причины

  • items["name"], хотя items это список словарей: сначала выбери элемент по номеру.
  • В цикле for item in items внутри написано items[item]: item уже сам элемент.

как починить

Обращайся к элементу списка по номеру или перебирай элементы напрямую.

было

for user in users:
    print(users[user])

стало

for user in users:
    print(user)

списки в справочнике

TypeError: string indices must be integers, not str

индексы строки должны быть целыми числами

К строке обратились по ключу, как к словарю. Строка отдаёт символы только по номеру.

частые причины

  • JSON прочитан как текст и не разобран через json.loads.
  • В цикле по словарю перебираются ключи-строки, а код ждёт вложенные словари.

как починить

Проверь, что в переменной словарь, а не строка: print(type(x)).

словари в справочнике

TypeError: 'str' object cannot be interpreted as an integer

объект типа str нельзя использовать как целое число

Функция ждала целое число, а получила str. Чаще всего это range() со строкой из input().

частые причины

  • range(input()) без приведения к int.
  • Дробное число там, где нужен индекс или счётчик.

как починить

Приведи значение к целому: range(int(n)).

было

n = input()
for i in range(n):

стало

n = int(input())
for i in range(n):

преобразование типов в справочнике

TypeError: int() argument must be a string, a bytes-like object or a real number, not 'list'

аргумент int() должен быть строкой или числом, а не list

В int() передали значение типа list, а преобразовать в число можно только строку или число.

частые причины

  • int(input().split()): split вернул список, а int нужен каждому элементу.
  • В int() попал None или целый список.

как починить

Преобразуй элементы по одному: list(map(int, input().split())).

было

nums = int(input().split())

стало

nums = list(map(int, input().split()))

преобразование типов в справочнике

TypeError: must be str or None, not tuple

нужна строка, а передан tuple

Метод строки ждал одну строку, а получил tuple. Например, split и strip принимают только строку-разделитель.

частые причины

  • text.split((",", ";")): несколько разделителей кортежем.
  • В replace передан список вместо строки.

как починить

Передавай одну строку. Несколько разделителей обрабатывай по очереди или через re.split.

было

parts = text.split((",", ";"))

стало

parts = text.replace(";", ",").split(",")

методы строк в справочнике

TypeError: sequence item 0: expected str instance, int found

элемент 0: ожидалась строка, найден int

join склеивает только строки, а в списке на позиции 0 лежит int.

частые причины

  • ", ".join(numbers) для списка чисел.

как починить

Преобразуй элементы в строки: ", ".join(map(str, numbers)).

было

print(", ".join([1, 2, 3]))

стало

print(", ".join(map(str, [1, 2, 3])))

методы строк в справочнике

TypeError: Value after * must be an iterable, not int

после * должна идти коллекция, а не int

Звёздочка в вызове распаковывает список или кортеж, а здесь после неё стоит int.

частые причины

  • print(*n), где n число, а не список.

как починить

Распаковывай только коллекции: print(*items). Одиночное значение передавай как есть.

было

print(*5)

стало

print(5)

функции в справочнике

TypeError: 'list' object is not an iterator

объект типа list не итератор

next() работает только с итератором, а list это коллекция: её сначала нужно превратить в итератор через iter().

частые причины

  • next(items) для списка.
  • Функция-генератор вызвана без скобок или её результат перезаписан списком.

как починить

Создай итератор: it = iter(items), затем next(it). Или просто перебирай через for.

было

items = [1, 2, 3]
print(next(items))

стало

it = iter([1, 2, 3])
print(next(it))

генераторы в справочнике

TypeError: can't multiply sequence by non-int of type 'str'

нельзя умножить последовательность на str

Умножение строки или списка работает только на целое число, а второй операнд типа str.

частые причины

  • Два значения из input() перемножаются как строки.
  • Дробное число умножается на строку.

как починить

Приведи оба операнда к числам: int(a) * int(b).

было

a = input()
b = input()
print(a * b)

стало

a = int(input())
b = int(input())
print(a * b)

преобразование типов в справочнике

TypeError: unhashable type: 'list'

нехешируемый тип: list

Ключом словаря и элементом множества может быть только неизменяемое значение, а list изменяемый.

частые причины

  • Список использован как ключ словаря.
  • Список добавлен в set.

как починить

Замени список на кортеж: (x, y) вместо [x, y].

было

seen = {[1, 2]: "пара"}

стало

seen = {(1, 2): "пара"}

изменяемые и неизменяемые типы

TypeError: 'str' object does not support item assignment

объект типа str не поддерживает присваивание по индексу

Значение типа str нельзя менять по частям: строки и кортежи неизменяемы.

частые причины

  • s[0] = "A" для строки.
  • Изменение элемента кортежа.

как починить

Собери новое значение: s = "A" + s[1:]. Если нужны правки по индексу, работай со списком.

было

s = "привет"
s[0] = "П"

стало

s = "привет"
s = "П" + s[1:]

изменяемые и неизменяемые типы

TypeError

ошибка типа

Операция получила значение не того типа, который она умеет обрабатывать. Текст после двоеточия называет операцию и типы.

частые причины

  • Строка из input() там, где нужно число.
  • None вместо значения: функция без return.
  • Список вместо одиночного значения или наоборот.

как починить

Выведи type() каждого участника операции и приведи типы явно.

TypeError и ValueError в справочнике

AttributeError: 'NoneType' object has no attribute 'append'

у объекта None нет атрибута append

Переменная содержит None, а код зовёт у неё .append. None появляется, когда функция ничего не вернула.

частые причины

  • items = items.sort(): sort сортирует на месте и возвращает None.
  • Своя функция без return.
  • dict.get() не нашёл ключ.

как починить

Не присваивай результат методов, которые меняют объект на месте (sort, append, reverse). Проверь, что функция возвращает значение.

было

items = items.sort()
items.append(4)

стало

items.sort()
items.append(4)

AttributeError в справочнике

AttributeError: module 'math' has no attribute 'sqr'

в модуле math нет атрибута sqr

Модуль math импортирован, но имени sqr в нём нет.

частые причины

  • Опечатка в имени функции модуля.
  • Свой файл назван как библиотека (random.py, math.py) и импортируется вместо неё.

как починить

Проверь имя по документации модуля и переименуй свой файл, если он совпадает с библиотекой.

было

import math
print(math.sqr(16))

стало

import math
print(math.sqrt(16))

AttributeError в справочнике

AttributeError: 'list' object has no attribute 'push'

у объекта типа list нет атрибута push

У значения типа list нет метода или поля push: либо опечатка в имени, либо в переменной не тот тип.

частые причины

  • Метод из другого языка: push, length, size.
  • Опечатка: apend, lenght.
  • Переменная оказалась строкой вместо списка или числом вместо объекта.

как починить

Посмотри доступные методы: print(dir(x)). Для списка добавление это append, длина это len(x).

было

items.push(4)

стало

items.append(4)

AttributeError в справочнике

AttributeError

ошибка атрибута

Код обращается к полю или методу, которого у объекта нет.

частые причины

  • Опечатка в имени метода.
  • Переменная другого типа, чем ожидалось.

как починить

Проверь тип через type(x) и доступные имена через dir(x).

AttributeError в справочнике

Как искать причину

  1. NameError: прочитай имя из сообщения посимвольно, Python сам подсказывает «Did you mean». Проверь, что переменная создаётся раньше, чем используется, и в той же функции, а не в соседней.
  2. TypeError про операцию между типами: напечатай type(x) у обоих участников. Чаще всего число пришло строкой из input() и его нужно превратить через int() или float() до сложения и сравнения.
  3. «object is not callable» и «object is not subscriptable» обычно значат, что имя перекрыто: переменную назвали как функцию (list, str, print) или забыли скобки вызова либо индекс.
  4. AttributeError: у объекта нет такого метода или поля. Посмотри dir(obj) или документацию типа: у списков append, а не push, у строк нет метода add.

Как читать трейсбек

  1. Читай снизу вверх: последняя строка называет ошибку и объясняет её текстом.
  2. Строка выше с File "...", line N показывает, где Python остановился. Для SyntaxError причина часто на строке выше указанной.
  3. Стрелка ^ под кодом отмечает место, где разбор сломался.

Дальше