Что такое чистая функция
Все функции надо стараться делать чистыми: такими, чтобы их результат зависел только от входных параметров и не имели side-effects: не могли сломать другие функции.
Простой чеклист чистой функции:
- не пишет в файловую систему;
- не пишет в stdout, stderr (print);
- не меняет глобальные переменные;
- не меняет аргументы, поданные на вход функции (edited);
- не меняет ход выполнения программы (не используют
exit()
, например); - не использует внутри себя грязные функции.
Вот некоторые плюсы чистых функций
- безопасность. Потому что на результат работы функции ничего не влияет. В том числе, такие настройки системы как кодировка stdout (print).
- предсказуемость. В каком бы окружении не была запущена функция, результат будет один. Можно спокойно использовать и не бояться ошибки.
- тестируемость. Если результат зависит только от параметров, то тесты пишутся на счёт раз. Это очень важно.
Если у тебя возник вопрос “Так а как же вообще мне выводить сообщение в консоль?”.
То ответ прост и сложен одновременно.
Размещай ввод/вывод внутри конструкции if __name__ == '__main__'
, либо внутри специальных функций вызываемых оттуда.
А все остальные функции сохраняй чистыми.
Если обработать входные данные сложно - возвращай None или выкидывай исключение с кодом/описанием ошибки.
Пусть с этим разбирается вызывающая программа/функция.
И еще кое-что важное. Принято все функции по умолчанию считать чистыми. Если кто-то использует написанную тобой функцию, то он исходит из того что она чистая, если ты явно не укажешь обратного в её названии.
Нарушение этого негласного соглашения вызывает бурную реакцию WTF. Если без “грязной” функции не обойтись - используй в названии слова print, write, save и пр. слова ассоциирующиеся с операциями ввода/вывода. И никогда не мешай в одной функции ввод/вывод с нетривиальной обработкой данных, всегда разноси.
Почитать на тему можно вот что:
- статья “Чистые фунции” на Хабре
- статья “Чистые и детерминированные функции” на Хабре
- про чистые функции на Википедии
Чистота – залог здоровья
Попробуйте бесплатные уроки по Python
Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.
Переходите на страницу учебных модулей «Девмана» и выбирайте тему.