web-dev-qa-db-ja.com

eval、exec、およびcompileの違いは何ですか?

私はPythonコードの動的評価を見てきました、そしてeval()compile()関数、そしてexecステートメントに出会いました。

誰かがevalexecの違い、およびcompile()のさまざまなモードがどのように当てはまるかを説明できますか?

376
andrewdotnich
  1. 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.
    
  2. 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.
    
  3. compileは、execおよびevalの下位バージョンです。ステートメントや式を実行または評価するのではなく、それを実行できるコードオブジェクトを返します。モードは次のとおりです。

    1. compile(string, '', 'eval')は、eval(string)を実行した場合に実行されたはずのコードオブジェクトを返します。このモードでは、ステートメントを使用できませんことに注意してください。 (単一の)式だけが有効です。
    2. compile(string, '', 'exec')は、exec(string)を実行した場合に実行されたはずのコードオブジェクトを返します。ここではいくつでも文を使用できます。
    3. compile(string, '', 'single')execモードに似ていますが、最初のステートメント以外のすべてを無視します。その結果を含むif/elseステートメントは単一ステートメントと見なされることに注意してください。
189
Max Shawabkeh

execはステートメント用であり、何も返しません。 evalはexpression用であり、expressionの値を返します。

式は「何か」を意味し、文は「何かをする」を意味します。

49
Wu Li