Что означает ошибка TypeError: function got an unexpected keyword argument
easy

Что означает ошибка TypeError: function got an unexpected keyword argument

Функция получила не тот аргумент, который она ожидала

Ситуация: стажёр решил изучить функции в Python поглубже и выяснил, что у функций есть необязательные аргументы. Их можно передавать, а можно не передавать, и тогда функция возьмёт значение переменной по умолчанию. Решив проверить, как это работает, стажёр пишет такой код. В нём функция получает значение обязательного параметра и указание поменять необязательный — чтобы вместо «Здравствуйте» компьютер вывел слово «Привет»:

def greet(someone):
    greeting = 'Здравствуйте'
    print(greeting + ', ' + someone)
 
greet('Миша', greeting = 'Привет')

Вроде всё верно, но при запуске скрипт выдаёт ошибку:

❌ TypeError: greet() got an unexpected keyword argument 'greeting'

Что это значит: Python встретил аргумент, который мы передали в функцию, но не нашёл его в списке аргументов при объявлении функции. Проще говоря, такого аргумента у функции нет, но мы решили его использовать без объявления.

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

А потом программист вызвал эту функцию, но указал ей не один аргумент, а два. Программист имел в виду, что вторым аргументом он обратится напрямую к тому, что происходит в функции (здесь — к переменной greeting). Но так нельзя. Python не пускает внутрь функции, пока ты чётко ему не скажешь, что нужно получить от пользователя. 

Что делать с ошибкой TypeError: function got an unexpected keyword argument

Есть два решения:

  1. Добавить функции недостающий аргумент.
  2. Использовать глобальные переменные.

Если нам важно, чтобы мы могли в любой момент изменить некоторую внутреннюю логику функции, лучше добавить в объявление функции этот необязательный аргумент. Так мы получим стандартную работу функции в большинстве случаев и нестандартную — когда нам это нужно. Для этого нужно просто указать имя переменной и её значение по умолчанию.

В нашем случае мы хотим иметь возможность поменять приветствие, поэтому вместо локальной переменной greeting сделаем это необязательным аргументом:

def greet(someone, greeting = 'Здравствуйте'):
    print(greeting + ', ' + someone)
 
greet('Миша', greeting = 'Привет')

Второй вариант — вынести локальную переменную greeting из функции и сделать её глобальной. Так мы можем управлять ей из любого места программы, но это может повлиять на безопасность кода, если за этим не следить. В нашем случае это безопасно, поэтому можно переделать так:

# значение по умолчанию
greeting = 'Здравствуйте'
def greet(someone):
    print(greeting + ', ' + someone)

# новое значение
greeting = 'Привет'
greet('Миша')

Текст:

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

Редактор:

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

Художник:

Алексей Сухов

Корректор:

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

Вёрстка:

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

Соцсети:

Виталий Вебер

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