Чистые функции

Все функции надо стараться делать чистыми: такими, чтобы их результат зависел только от входных параметров и не имели side-effects: не могли сломать другие функции.

Простой чеклист чистой функции:

  • не пишет в файловую систему;
  • не пишет в stdout, stderr (print);
  • не меняет глобальные переменные;
  • не меняет аргументы, поданные на вход функции (edited);
  • не меняет ход выполнения программы (не используют exit(), например);
  • не использует внутри себя грязные функции.

Вот некоторые плюсы чистых функций

  • безопасность. Потому что на результат работы функции ничего не влияет. В том числе, такие настройки системы как кодировка stdout (print).
  • предсказуемость. В каком бы окружении не была запущена функция, результат будет один. Можно спокойно использовать и не бояться ошибки.
  • тестируемость. Если результат зависит только от параметров, то тесты пишутся на счёт раз. Это очень важно.

Если у тебя возник вопрос "Так а как же вообще мне выводить сообщение в консоль?". То ответ прост и сложен одновременно. Размещай ввод/вывод внутри конструкции if __name__ == '__main__', либо внутри специальных функций вызываемых оттуда. А все остальные функции сохраняй чистыми. Если обработать входные данные сложно - возвращай None или выкидывай исключение с кодом/описанием ошибки. Пусть с этим разбирается вызывающая программа/функция.

И еще кое-что важное. Принято все функции по умолчанию считать чистыми. Если кто-то использует написанную тобой функцию, то он исходит из того что она чистая, если ты явно не укажешь обратного в её названии.

Нарушение этого негласного соглашения вызывает бурную реакцию WTF. Если без "грязной" функции не обойтись - используй в названии слова print, write, save и пр. слова ассоциирующиеся с операциями ввода/вывода. И никогда не мешай в одной функции ввод/вывод с нетривиальной обработкой данных, всегда разноси.

Почитать на тему можно вот что:

Чистота – залог здоровья