ホームページ  >  記事  >  バックエンド開発  >  Python 組み込み関数 — eval

Python 組み込み関数 — eval

黄舟
黄舟オリジナル
2017-01-19 16:39:351640ブラウズ

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)!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。