-4

どうしてこれなの?

>>> eval(str(17*3))
51
>>> t=17;t*3
51
>>> eval(str(t=17;t*3))
  File "<stdin>", line 1
    eval(str(t=17;t*3))
                 ^
SyntaxError: invalid syntax
>>> 

eval() 変数を送信する方法はありますか?

>>> z=input("ins: ");cxc=compile(z,'<string>','exec');y=eval(cxc);print(y)
ins: t=17;t+3
None
>>> 

もっと正確に言うべきだったのですが、良い答えに助けられたら、それは普遍的なものになると思いました. しかし、これは@cnicutarの提案を試みる私の実際の使用例です。

>>> z=input("ins: ");y=eval(z);print(y)
ins: 't*13+q', {'q':4,'t':2}
('t*13+q', {'q': 4, 't': 2})
>>> 

@LtWorf と @Ghopper21 の実装を試しています。

4

4 に答える 4

2

使用してみてくださいcompile

>>> expr = compile('t = 42; print(t)', '<string>', 'exec')
>>> eval(expr)
42
于 2013-02-10T11:36:15.213 に答える
2

evalはい、 2番目(および3番目)の引数として辞書を使用して変数を送信できます。これらの引数はここに文書化されています。これがあなたの例です:

>>> eval('t*3', {'t': 17})
51

ちなみに、発生する特定のエラーは、eval最初のパラメーターとして変数を割り当てるステートメントを取得できないためではありません(実際にはできませんが)。これは、パラメータがstr式である必要があるためです。式は変数を割り当てることができず、ステートメントは割り当てることができません。str:だけで同じエラーが発生することに注意してください。

>>> str(t=17;t*3)
  File "<stdin>", line 1
    str(t=17;t*3)
        ^
SyntaxError: invalid syntax

編集:あなたの特定のユースケースに関しては、あなたが持っている問題は入力文字列です

 't*13+q', {'q':4,'t':2}

inputカンマが存在するため、(文字列を読み取り、それを呼び出すによっevalて)、いわゆる「タプル」、つまり複数の式を1つの式に組み合わせたものに評価されます。タプルを評価することはできません。(ユースケースの例では、実際にはエラーが返されるはずです。なぜそうでないのかわかりません。)

これを修正するには、タプルを「解凍」して、タプルevalのどの部分を評価する式(最初の部分、文字列式t*13+q、つまりz[0])であり、どの部分が変数値の辞書であるか(2番目の部分)を知る必要があります。 、辞書{'q':4,'t':2}で、すなわち)、すなわちでz[1]置き換えますy=eval(z)

y = eval(z[0], z[1])

あるいは(そしてよりPython的に)、アスタリスク構文を使用して、タプルを関数の連続するパラメーターに自動的にアンパックするようにPythonに指示できますy=eval(z)

y = eval(*z)
于 2013-02-10T12:13:39.207 に答える
1

あなたもすることができます:

>>> t = 17
>>> print eval('t*3')
51
于 2013-02-10T11:38:28.337 に答える
0
eval(source[, globals[, locals]]) -> value

{'a' = 0、'b'=1}などを含む辞書を渡すこともできます...

例えば:

eval('t*13+q', {'q':4,'t':2})
于 2013-02-10T12:12:36.323 に答える