18

次のタブインデントされた文字列を評価しようとしています。

'''for index in range(10):
        os.system("echo " + str(index) + "")
'''

「エラーが発生しました:無効な構文、1行目」

それは何について不平を言っていますか?eval()ステートメントと一致するようにインデントする必要がありますか、それとも文字列ファイルまたは一時ファイルに書き込んでそれを実行する必要がありますか、それとも他の何かですか?

ありがとう、

4

4 に答える 4

29

evalのようなものを評価します5+3

exec次のようなものを実行しますfor ...

>>> eval("for x in range(3):print x")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    for x in range(3):print x
      ^
SyntaxError: invalid syntax
>>> exec("for x in range(3):print x")
0
1
2
>>> eval('5+3')
8
于 2012-10-02T20:47:20.417 に答える
15

このようなステートメントを使用するには、まずcompileevalを使用してコード オブジェクトに変換する必要があります。

In [149]: import os

In [150]: cc = compile('''for index in range(10):
    os.system("echo " + str(index) + "")''','<string>','single')

In [154]: eval cc
--------> eval(cc)
0
Out[154]: 0
1
Out[154]: 0
2
Out[154]: 0
3
Out[154]: 0
4

In [159]: cc = compile("2+2", '<string>', 'single')  # works with simple expressions too 

In [160]: eval cc
--------> eval(cc)
Out[160]: 4
于 2012-10-02T20:52:10.783 に答える
6

eval( )式を評価し、( exec)ステートメントを実行します。

参照:式とステートメント

式:値に評価されるもの。例:1 + 2 / x
ステートメント:何かを実行するコード行。例:GOTO 100

于 2012-10-02T20:53:28.447 に答える
6

(このようなコードを本番環境に配置する前に、最後にあるデフォルトのセキュリティ警告を参照してください!)

exec他の回答は、 と の違いをうまく説明していevalます。

それにもかかわらず、私はx=1; y=2; x+y人々に書くことを強制するのではなく、次のような入力を取りたいと思っていました:

def f():
   x = 1
   y = 2
   return x + y

この種の関数を構築するためのコードの文字列操作は、リスクの高いビジネスです。

私は次のアプローチを使用することになりました:

def multiline_eval(expr, context):
    "Evaluate several lines of input, returning the result of the last line"
    tree = ast.parse(expr)
    eval_expr = ast.Expression(tree.body[-1].value)
    exec_expr = ast.Module(tree.body[:-1])
    exec(compile(exec_expr, 'file', 'exec'), context)
    return eval(compile(eval_expr, 'file', 'eval'), context)

これは Python コードを解析します。ast ライブラリを使用して、最後の行以外のすべての ast を再構築します。そして最後の行で、前者を実行し、後者を評価します。

セキュリティ警告

これは、添付する必要がある必須のセキュリティ警告ですeval。 特権のないユーザーが提供するコードをEval'ing および'ing することは、もちろん安全ではありません。execこのような場合、別のアプローチを使用するか、ast.literal_eval を検討することをお勧めします。evalそして、exec実際にユーザーに python の完全な表現力を与えたくない場合を除いて、悪い考えになる傾向があります。

于 2017-01-04T20:25:29.130 に答える