Найди ошибку в объявлении функции

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)