私はPythonコードの動的評価を見てきました、そしてeval()
とcompile()
関数、そしてexec
ステートメントに出会いました。
誰かがeval
とexec
の違い、およびcompile()
のさまざまなモードがどのように当てはまるかを説明できますか?
exec
は式ではありません。Python2.xではステートメント、Python 3.xでは関数です。文字列に含まれるステートメントまたはステートメントのセットをコンパイルしてすぐに評価します。例:
exec('print(5)') # prints 5.
# exec 'print 5' if you use Python 2.x, nor the exec neither the print is a function there
exec('print(5)\nprint(6)') # prints 5{newline}6.
exec('if True: print(6)') # prints 6.
exec('5') # does nothing and returns nothing.
eval
は組み込み関数(not a statement)で、式を評価して式が生成した値を返します。例:
x = eval('5') # x <- 5
x = eval('%d + 6' % x) # x <- 11
x = eval('abs(%d)' % -100) # x <- 100
x = eval('x = 5') # INVALID; assignment is not an expression.
x = eval('if 1: x = 4') # INVALID; if is a statement, not an expression.
compile
は、exec
およびeval
の下位バージョンです。ステートメントや式を実行または評価するのではなく、それを実行できるコードオブジェクトを返します。モードは次のとおりです。
compile(string, '', 'eval')
は、eval(string)
を実行した場合に実行されたはずのコードオブジェクトを返します。このモードでは、ステートメントを使用できませんことに注意してください。 (単一の)式だけが有効です。compile(string, '', 'exec')
は、exec(string)
を実行した場合に実行されたはずのコードオブジェクトを返します。ここではいくつでも文を使用できます。compile(string, '', 'single')
はexec
モードに似ていますが、最初のステートメント以外のすべてを無視します。その結果を含むif
/else
ステートメントは単一ステートメントと見なされることに注意してください。execはステートメント用であり、何も返しません。 evalはexpression用であり、expressionの値を返します。
式は「何か」を意味し、文は「何かをする」を意味します。