純粋な 関数は、数学関数に似た関数であり、「実世界」との相互作用も副作用もありません。より実用的な観点からは、純粋な関数では次のことができないことを意味します。
- メッセージを印刷または表示する
- ランダムにする
- システム時刻に依存
- グローバル変数を変更する
- その他
このすべての制限により、非純粋関数よりも純粋関数について推論する方が簡単になります。プログラムのバグが少なくなるように、大部分の関数を純粋にする必要があります。
Haskell のような巨大な型システムを持つ言語では、読者は関数が純粋かどうかを最初からすぐに知ることができるため、後続の読み取りが容易になります。
@pure
Python では、この情報は、関数の上に置かれたデコレーターによってエミュレートされる場合があります。また、そのデコレーターが実際に検証作業を行うことも望んでいます。私の問題は、そのようなデコレータの実装にあります。
今のところ、関数のソース コードを調べて、または、または、およびそれらのいずれかが見つかった場合に不平を言うなどの流行語を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
しかし、あなたの運次第でうまくいくかもしれないし、うまくいかないかもしれない奇妙なハックのように感じます。より良いデコレータを書くのを手伝ってくれませんか?