A purefunction - функция, аналогичная математической функции, где нет взаимодействия с «реальным миром» и побочными эффектами. С более практической точки зрения, это означает, что чистая функция может не:Как проверить, является ли функция чистой в Python?
- печати или иным образом показать сообщение
- случайные
- зависит от времени системы
- Изменить глобальные переменные
- И другие
Все эти ограничения облегчают рассуждение о чистой функции чем нечистые. Большинство функций должны быть чистыми, чтобы программа могла иметь меньше ошибок.
На языках с огромной системой типов, такой как 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
Однако он чувствует, как странный рубить, которые могут или не могут работать в зависимости от вашей удачи, могли бы вы мне помочь в написании лучшего декоратора?
Вы можете «проверить.getsource», затем «ast.parse» и пройти узлы, проверить разные вещи ... но вы будете идти против причины, по которой существует язык, - посмотрите, используя модуль 'abc', если хотите , а затем 'isinstance', где нужно ... - python ** сильно ** напечатан - не ** статически ** напечатано –
@ Динамические языки jonClements на самом деле выполняют меньше проверки времени компиляции, но я думаю, что это конкретная проверка значительно улучшит организацию программы и дважды проверит программистов на понимание его собственной работы. – Caridorc
Затем используйте статически типизированный язык ... :) Вы можете либо просмотреть его как * плохую вещь, либо вещь * хорошо *, но так оно и есть –