eval()
遊んでいるときにつまずいたPythonの関数があります。この関数が必要になるケースは考えられません。誰でも例を挙げることができますか?
14 に答える
eval
また、exec
ソースコードを動的に取得し、少し変更してから実行するための便利な手っ取り早い方法ですが、特に本番コードでは、「迅速かつ迅速に」とは対照的に、これが最善の方法とは言えません。ダーティ」プロトタイプ&c。
たとえば、このような動的なPythonソースを処理する必要がある場合、astモジュールに到達するのははるかにast.literal_eval
安全ですeval
(1回限りで依存している場合は、式の文字列形式で直接呼び出すことができます)。単純な定数のみで、またはnode = ast.parse(source)
最初に実行node
してから、適切な訪問者と一緒に操作します。たとえば、変数ルックアップ、次にliteral_eval
ノード)-または、ノードを適切な形にしてセキュリティの問題を検証したら、次のことができます。compile
それ(コードオブジェクトを生成する)とそれから新しい関数オブジェクトを構築します。はるかに単純ではありませんが(それが最も単純な場合ast.literal_eval
と同じくらい単純であることを除いてeval
!)、本番品質のコードではより安全で好ましいです。
私が人々が(ab-)使用exec
しているのを見た多くのタスクでは、およびeval
、などのPythonの強力な組み込み、&cにインデックスを付けることで、望ましい、実際には多くの場合、より単純なソリューションが提供されます。JSONの解析などの特定の用途については、などのライブラリモジュールの方が優れています(たとえば、この質問に対する耳鳴りの回答に関するSilentGhostのコメントを参照してください)。等...getattr
setattr
globals()
json
ウィキペディアeval
の記事は非常に有益であり、さまざまな用途について詳しく説明しています。
それが提案する用途のいくつかは次のとおりです。
- 数式の評価
- コンパイラのブートストラップ
- スクリプト (一般的に動的言語はこれに非常に適しています)
- 語学教師
これを使用して、ユーザーが独自の「スクリプトレット」を入力できるようにすることもできます。これは、複雑なシステムの動作をカスタマイズするために使用できる小さな式 (または小さな関数)です。
そのコンテキストで、セキュリティへの影響をあまり気にする必要がない場合 (たとえば、教育を受けたユーザーベースを持っている場合)、eval() は良い選択かもしれません。
過去に、eval() を使用してアプリケーションにデバッグ インターフェイスを追加しました。実行中のアプリケーションの環境にあなたをドロップする telnet サービスを作成しました。入力は eval() を介して実行されるため、アプリケーションで Python コマンドを対話的に実行できます。
私がかつて書いたプログラムでは、幾何学的パラメーターを値と前の値の python 式の両方として指定できる入力ファイルがありました。
a=10.0
b=5.0
c=math.log10(a/b)
Python パーサーがこの入力ファイルを読み取り、eval() を使用して値と式を評価する最終データを取得しました。
良いプログラミングだとは言いませんが、原子炉を運転する必要はありませんでした。
クイックJSONパーサーとして使用しています...
r='''
{
"glossary": {
"title": "example glossary"
}
}
'''
print eval(r)['glossary']['title']
Evalは、プログラム内からPythonインタープリターと対話する方法です。リテラルをevalに渡すことができ、それはそれらをpython式として評価します。
例えば -
print eval("__import__('os').getcwd()")
現在の作業ディレクトリを返します。
乾杯
私はちょうど eval の良い使い方に出くわしました。私はいくつかのコードのテストスイートを書いていて、すべてのメソッドが実行されるテストである Test クラスを作成しました。各メソッドを個別に呼び出さなくても、すべてのテスト メソッドを実行できる方法が必要でした。それで、かなり汚いことを書きました。
class Test:
def __init__(self, *args):
#bs
def test1(self):
#bs
def test2(self):
#bs
if __name__ == "__main__":
import argparse
#argparse bs
test = Test(*bs_args)
for func in (i for i in dir(test) if i[0] != '_' and i not in test.__dict__):
print(eval('test.{func}()'.format(func = func)))
任意のテスト ケースの動的評価は非常に優れています。メソッドを作成するだけで、保存後にメソッドをテスト スイートに含めることができます。コードに関しては、基本的に、テスト オブジェクトで定義されているメソッドを検査し、それらがデフォルトの Python の「魔法の」メソッドまたは Test オブジェクトの属性ではないことを確認します。その後、それらはメソッドであり、評価できると想定できます。
eval()
通常はあまり役に立ちません。私がこれを使った数少ないことの 1 つは (exec()
実際にはそうでしたが、かなり似ています)、私が Python で作成したアプリケーションをユーザーがスクリプト化できるようにすることでした。C++ などで記述した場合、アプリケーションに Python インタープリターを組み込む必要があります。
eval() は単一文用で、exec() は複数文用です。
通常、これらを使用して、bash シェルのようにいくつかのスクリプトを追加またはアクセスします。
それらはメモリ内でいくつかのバイトスクリプトを実行できるため、重要なデータまたはスクリプトがある場合は、「秘密」をデコードして解凍し、必要なことをすべて実行できます。
私exec
はPythonでプラグインのシステムを作成するために使用します。
試す: exec( "from" + plugin_name + "import Plugin") myplugin = Plugin(module_options、config = config) ImportErrorを除いて、メッセージ: 致命的("そのようなモジュールはありません"+ plugin_name + \ "(またはプラグインコンストラクターなし)私のPythonパス:" + str(message)) 例外を除く: fatal( "Module" + plugin_name + "をロードできません:" + \ str(sys.exc_type)+ ":" + str(sys.exc_value)+ \ "。\nオプションが欠落しているか誤っている可能性がありますか?")
次のようなプラグインを使用する場合:
クラスプラグイン: def __init __(自己): パス def query(self、arg): ..。
あなたはそれを次のように呼ぶことができます:
結果=myplugin.query( "something")
exec
/なしでPythonでプラグインを使用できるとは思いませんeval
。