eval(string)
メソッドを 使用してこれを行うことができます。
意味
eval(code, globals=None, locals=None)
コードは単なる標準の Python コードです。これは、適切にインデントする必要があることを意味します。
グローバルには__builtins__
、セキュリティ上の目的で役立つカスタム定義を含めることができます。
例
eval("print('Hello')")
hello
コンソールに出力します。コードで使用するローカル変数とグローバル変数を指定することもできます。
eval("print('Hello, %s'%name)", {}, {'name':'person-b'})
セキュリティ上の懸念
ただし、注意してください。ユーザー入力はすべて実行されます。検討:
eval("import os;os.system('sudo rm -rf /')")
それを回避する方法はいくつかあります。最も簡単なのは、次のようなことです。
eval("import os;...", {'os':None})
ハードドライブを消去するのではなく、例外をスローします。あなたのプログラムはデスクトップですが、人々がスクリプトを再配布した場合、これは問題になる可能性があります。これは意図されていると思います。
奇妙な例
eval
これはかなり奇妙な使い方の例です:
def hello() : print('Hello')
def world() : print('world')
CURRENT_MOOD = 'happy'
eval(get_code(), {'contrivedExample':__main__}, {'hi':hello}.update(locals()))
これが eval 行で行うことは次のとおりです。
- 現在のモジュールに別の名前を付けます (
contrivedExample
スクリプトになります)。消費者はすぐに呼び出すことができますcontrivedExample.hello()
。)
hi
を指していると定義します。hello
- そのディクショナリを、実行中のモジュール内の現在のグローバルのリストと組み合わせました。
不合格
exec
実際にステートメントを使用する必要があることがわかりました (コメント者に感謝します!) 。おっと。修正された例は次のとおりです。
exec
意味
(これはおなじみのようです!) Exec はステートメントです:
exec "code" [in scope]
scope は、ローカル変数とグローバル変数の両方の辞書です。これが指定されていない場合、現在のスコープで実行されます。
コードは単なる標準の Python コードです。これは、適切にインデントする必要があることを意味します。
exec
例
exec "print('hello')"
hello
コンソールに出力します。コードで使用するローカル変数とグローバル変数を指定することもできます。
eval "print('hello, '+name)" in {'name':'person-b'}
exec
セキュリティ上の懸念
ただし、注意してください。ユーザー入力はすべて実行されます。検討:
exec "import os;os.system('sudo rm -rf /')"
ステートメントを印刷
コメンターによっても指摘されているように、print
3.0 より前のすべてのバージョンの Python でのステートメントです。2.6 では、 と入力して動作を変更できますfrom __future__ import print_statement
。それ以外の場合は、次を使用します。
print "hello"
それ以外の :
print("hello")