Что означает ошибка TypeError: something() takes 0 positional arguments but 1 was given

Что означает ошибка TypeError: something() takes 0 positional arguments but 1 was given

Это когда аргументы появляются там, где их быть не должно

Ситуация: вы решили освоить мощь классов и попробовать ООП на Python. Делаете всё как по учебнику: сначала описываете класс, внутри него метод, а внутри метода — простую команду, которая пишет тестовое сообщение на экране:

# объявляем класс
class myClass():
    # внутри класса объявляем метод
    def myMethod():
        # внутри метода пишем команду, которую будет выполнять наш метод
        print('Это вызов метода внутри класса')

# создаём новый объект на основе класса
a = myClass()
# вызываем метод этого объекта
a.myMethod()

Кажется, что всё правильно, но при запуске появляется ошибка:

❌TypeError: myMethod() takes 0 positional arguments but 1 was given

Странно, ведь мы всё сделали всё как нужно.

Что это значит: Python обнаружил аргументы там, где их быть не должно. А раз аргументы есть и компилятор не знает, что с ними делать, то он останавливается и выдаёт эту ошибку.

Когда встречается: во всех случаях, когда мы указываем лишние аргументы или ставим их там, где они не нужны. Это необязательно будут ситуации из ООП — ошибка с аргументом может появиться в любой программе, где есть лишний аргумент.

Что делать с ошибкой TypeError: something() takes 0 positional arguments but 1 was given

Общее решение очевидно: нужно посмотреть на строку, на которую ругается Python, проверить в ней все аргументы и сверить их количество с тем, что должно быть по синтаксису. 

Вот простой случай: проверяем условие, и если всё сходится — выводим все названия ключей из словаря:

if choice == "5":
print("Решение найдено:")
for i in dictionary:
print(dictionary.keys(i))

Здесь будет такая же ошибка, потому что у keys() не может быть аргументов — он сразу выводит список всех ключей словаря. Достаточно написать так, чтобы ошибка ушла:

if choice == "5":
print("Решение найдено:")
for i in dictionary:
print(dictionary[i])

В нашем случае с ООП проблема чуть хитрее: Python ругается на строку a.myMethod(), у которой и так в описании нет никаких параметров. Но здесь дело в другом — вызов метода таким способом и есть ошибка. Объект почему-то не знает, что у него есть метод, который можно вызывать сам по себе, и воспринимает команду myMethod() как лишний аргумент.

Всё из-за того, что мы в описании метода не поставили в качестве аргумента ключевое слово self — оно как раз показывает, что этот метод можно вызывать снаружи. Добавим это, и ошибка исчезнет:

# объявляем класс
class myClass():
    # внутри класса объявляем метод
    def myMethod(self):
        # внутри метода пишем команду, которую будет выполнять наш метод
        print('Это вызов метода внутри класса')

# создаём новый объект на основе класса
a = myClass()
# вызываем метод этого объекта
a.myMethod()

Текст:

Михаил Полянин

Редактор:

Максим Ильяхов

Художник:

Даня Берковский

Корректор:

Ирина Михеева

Вёрстка:

Кирилл Климентьев

Соцсети:

Алина Грызлова

Любишь Python? Зарабатывай на нём!
Изучите самый модный язык программирования и станьте крутым бэкенд-разработчиком. Старт — бесплатно.
Попробовать
Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём!
Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Начать карьеру в ИТ
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме
Пишем собственный лапшесниматель
Пишем собственный лапшесниматель

Инструмент для защиты ума от пропаганды, контрпропаганды, инфобизнеса и лжепсихологов.

easy
Бигдата и тепловые карты на примере твитов Байдена и Трампа
Бигдата и тепловые карты на примере твитов Байдена и Трампа

Сразу видно, кто постит сам, а за кого это делает команда

medium
Шифр Вернама на JavaScript
Шифр Вернама на JavaScript

Невзламываемый шифр за 4 строчки кода.

medium
Как работает быстрая сортировка
Как работает быстрая сортировка

Ей уже 60 лет, но она до сих пор работает быстро

medium
Uncaught TypeError: Cannot read property — что это означает
Uncaught TypeError: Cannot read property — что это означает

Нельзя прочитать то, чего нет.

medium
Как работает язык SQL
Как работает язык SQL

Управляем базой данных из командной строки

medium
Что означает ошибка KeyError
Что означает ошибка KeyError

Это значит, что используется несуществующий ключ словаря

easy
Сделай сам: менеджер шаблонных ответов на любые письма
Сделай сам: менеджер шаблонных ответов на любые письма

Отправляем текст в буфер обмена одним кликом.

easy
Пишем программу, которая одобрит вам кредит

Или не одобрит, хехех.

easy
Пинг-понг против компьютера на JavaScript

Лёгкая версия

easy
easy