Ситуация: стажёр решил изучить функции в 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
Есть два решения:
- Добавить функции недостающий аргумент.
- Использовать глобальные переменные.
Если нам важно, чтобы мы могли в любой момент изменить некоторую внутреннюю логику функции, лучше добавить в объявление функции этот необязательный аргумент. Так мы получим стандартную работу функции в большинстве случаев и нестандартную — когда нам это нужно. Для этого нужно просто указать имя переменной и её значение по умолчанию.
В нашем случае мы хотим иметь возможность поменять приветствие, поэтому вместо локальной переменной greeting
сделаем это необязательным аргументом:
def greet(someone, greeting = 'Здравствуйте'):
print(greeting + ', ' + someone)
greet('Миша', greeting = 'Привет')
Второй вариант — вынести локальную переменную greeting
из функции и сделать её глобальной. Так мы можем управлять ей из любого места программы, но это может повлиять на безопасность кода, если за этим не следить. В нашем случае это безопасно, поэтому можно переделать так:
# значение по умолчанию
greeting = 'Здравствуйте'
def greet(someone):
print(greeting + ', ' + someone)
# новое значение
greeting = 'Привет'
greet('Миша')