13. Найди ошибку в объявлении функции
Условие задачи В приведённом фрагменте кода есть ошибка. Определите причину и исправьте реализацию функции.
def print(cmd: str) -> Dict[str, float]:
print(cmd) if isinstance(cmd, str) else print(cmd * 2)
Спойлеры к решению
Подсказки
- Ошибка в том, что функция названа
print. - Она переопределяет встроенную функцию
print(). - Внутри функции вызов
print(cmd)обращается не к встроенномуprint, а к этой же функции. - В результате функция вызывает саму себя бесконечно.
- Это приведёт к
RecursionError. - Аннотация
-> Dict[str, float]тоже неверная, потому что функция ничего не возвращает.
Решение
def print_cmd(cmd) -> None:
if isinstance(cmd, str):
print(cmd)
else:
print(cmd * 2)
Пример использования:
print_cmd("hello") # hello
print_cmd(5) # 10
В исходном коде ошибка возникает из-за переопределения встроенной функции print:
def print(cmd: str) -> Dict[str, float]:
print(cmd)
После объявления такой функции имя print начинает ссылаться на пользовательскую функцию, а не на встроенную. Поэтому внутри функции происходит рекурсивный вызов самой себя.
Исправление: нужно переименовать функцию, например в print_cmd, и указать корректный тип возвращаемого значения None, потому что функция только выводит данные на экран и ничего не возвращает.
Если по условию имя функции обязательно должно остаться print, можно явно вызвать встроенный print через модуль builtins:
import builtins
def print(cmd) -> None:
if isinstance(cmd, str):
builtins.print(cmd)
else:
builtins.print(cmd * 2)