A pure function - это функция, аналогичная функции Математическая функция, где нет взаимодействия с "реальным миром" и побочными эффектами. С более практической точки зрения это означает, что чистая функция может не:
- Распечатайте или покажите сообщение другим пользователям
- Быть случайным
- В зависимости от системного времени
- Изменение глобальных переменных
- И другие
Все эти ограничения облегчают рассуждение о чистых функциях, чем нечистые. Большинство функций должны быть чистыми, чтобы программа могла иметь меньше ошибок.
В языках с огромной системой типов, такой как Haskell, читатель может знать с самого начала, если функция является или не является чистой, что облегчает последовательное чтение.
В Python эта информация может быть эмулирована декоратором @pure
, помещенным поверх функции. Я также хотел бы, чтобы этот декоратор действительно выполнял некоторые проверки. Моя проблема заключается в реализации такого декоратора.
Прямо сейчас я просто смотрю исходный код функции для ключевых слов, таких как global
или random
или print
, и жалуется, если он найдет один из них.
import inspect
def pure(function):
source = inspect.getsource(function)
for non_pure_indicator in ('random', 'time', 'input', 'print', 'global'):
if non_pure_indicator in source:
raise ValueError("The function {} is not pure as it uses `{}`".format(
function.__name__, non_pure_indicator))
return function
Однако это похоже на странный взлом, который может или не может работать в зависимости от вашей удачи, не могли бы вы помочь мне написать лучшего декоратора?