纯 函数是类似于数学函数的函数,其中没有与“现实世界”的交互,也没有副作用。从更实际的角度来看,这意味着纯函数不能:
- 打印或以其他方式显示消息
- 随意
- 取决于系统时间
- 更改全局变量
- 和别的
所有这些限制使得对纯函数的推理比对非纯函数的推理更容易。大多数函数应该是纯函数,这样程序可以减少错误。
在像 Haskell 这样具有庞大类型系统的语言中,读者可以从一开始就知道函数是纯函数还是非纯函数,从而使后续阅读变得更容易。
在 Python 中,这个信息可以通过@pure
放在函数顶部的装饰器来模拟。我也希望那个装饰器能够真正做一些验证工作。我的问题在于这样一个装饰器的实现。
现在,我只是在函数的源代码中查找流行语,例如global
or random
or 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
然而,这感觉就像一个奇怪的黑客,可能会也可能不会取决于你的运气,你能帮我写一个更好的装饰器吗?