Что означает ошибка 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