出力を生成するために、関数は通常、引数の値のみを使用します。ただし、関数が出力を生成するために、ファイルシステム、データベース、またはWebから何かを読み取る場合もあります。そのようなことが起こらないようにするための簡単で信頼できる方法が欲しいです。
私が見る1つの方法は、ファイルシステム、データベース、またはWebからの読み取りに使用できるPythonライブラリのホワイトリストを作成することです。しかし、それが進むべき道である場合、この(潜在的に巨大な)リストはどこで入手できますか。さらに、ファイルシステムからの読み取りに使用できるという理由だけで、ライブラリ全体を無効にしたくありません。たとえば、ユーザーがpandasライブラリを使用できるようにしたい(表形式のデータを保存および操作するため)。このライブラリを使用してファイルシステムからデータを読み取れるようにしたくありません。
この問題の解決策はありますか?
これに対する答えはノーです。探しているのは、をテストする関数ですfunctional purity
。ただし、このコードに示されているように、副作用が実際に呼び出されていないことを保証する方法はありません。
class Foo(object):
def __init__(self, x):
self.x = x
def __add__(self, y):
print("HAHAHA evil side effects here...")
# proceed to read a file and do stuff
return self
# this looks pure...
def f(x): return x + 1
# but really...
>>> f(Foo(1))
HAHAHA evil side effects here...
オブジェクトがその動作(フィールドアクセス、呼び出し、演算子のオーバーロードなど)を再定義できる包括的な方法のため、純粋関数を不純にする入力をいつでも渡すことができます。したがって、純粋関数は、引数に対して文字通り何もしない関数だけです...一般的にあまり役に立たない関数のクラス。
もちろん、他の制限を指定できれば、これは簡単になります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加