ホームページ >バックエンド開発 >Python チュートリアル >Python 組み込み関数 — eval
Python 組み込み関数 - eval
eval
evaleval(expression [, globals [, locals]])
この関数は、式文字列、またはコンパイル関数によってコンパイルされたコード オブジェクトを動的に実行するために使用されます。
パラメータ式は式文字列、またはコンパイルされたコードオブジェクトの名前です。
パラメータglobalsはグローバル名前空間であり、式の実行時にグローバルスコープの範囲を指定できます(特定のモジュールを使用できるように指定するなど)。 。
このパラメーターがデフォルトの場合、現在この関数を呼び出している現在のグローバル名前空間が使用されます。
パラメーター locals は、式の実行時にアクセスされるローカル名前空間を指定するために使用されます。
グローバル名前空間パラメーターが表示されているが、組み込みモジュールがデフォルトである場合、このモジュールは自動的にグローバル名前空間にコピーされます。
どのように設定されているかに関係なく、組み込みモジュールが使用できることを意味します。
両方の名前空間がデフォルトのメソッドを使用する場合、この関数を呼び出すときの名前空間は、対応する変数を見つけるために使用されます。
この機能を使用する理由?
この機能の理由は、動的言語とコンパイル言語の違いであるはずです。
コンパイル言語ではコードを動的に生成することは基本的に不可能であるため、
しかし動的言語は可能です。つまり、ソフトウェアがサーバーにデプロイされているということです。
ただし、変更が非常に少ない限り、コードのこの部分を直接変更する必要があり、ソフトウェア全体をリロードすることなく変更をすぐに実装できます。
もう 1 つは、この機能は機械学習で使用できます。例えば、ソフトウェアの使用頻度と方法に応じて、コードを動的に変更してユーザーの変更に適応できます。
これを考えると、コードを自己更新して改善を達成する生命力があるのでしょうか?
破壊的な動作をする場合、それは実際にはウイルスです。
>>> eval('1+1')
2
#全局命名空间为空,使用局部命名空间 >>> def make_fn(code): import math ALLOWED_LOCALS = {v:getattr(math,v) for v in filter( lambda x: x.startswith('_'),dir(math)) } return eval('lambda x: %s'%code ,None,ALLOWED_LOCALS) >>> f = make_fn('x+1') >>> print f(2)3
#使用全局命名空间 >>> def make_fng(code): import math ALLOWED = {v:getattr(math, v) for v in filter(lambda x: not x.startswith('_'), dir(math)) } ALLOWED['__builtins__'] = None return eval('lambda x: %s' % code, ALLOWED, {}) >>> f = make_fng('cos(x)') >>> print f(9) -0.911130261885 >>> f = make_fng('cos(x*x)') >>> print f(9) 0.776685982022上記は Python 組み込み関数-eval の内容です。 PHP 中国語 Web サイト (www.php .cn)!