eval
文字列を Python 式として評価するにはどうすればよいですか。
オブジェクトの表現を取得するためにオブジェクトを呼び出す必要はありませんeval
。pdb
/は、オブジェクトの表現を取得するためにオブジェクトをWinPDB
呼び出しませんeval
。実際、eval
は のほぼ反対ですrepr
。
の結果を見たい場合はfoo.__repr__()
、 を呼び出すか、コンソールrepr(foo)
に入力します。コンソールで任意のfoo
式を入力すると、 が表示されます。repr(that expression)
もちろん、これはeval(foo)
、コンソールで入力すると、 が表示されることを意味しますrepr(eval(foo))
。しかし、それは何の関係もありませんeval
。他の表現と同じです。
一方、Winpdb コンソールでは、Python コードを実行しているのではなく、Winpdb コードを実行しています。Winpdb にはeval
、Python 関数 に似たという名前のコマンドがありますeval
が、同じものではありません。
ドキュメントにあるように、ライブ デバッグ対象セッションでeval foo
効果的に評価されます。そのようなフラグメントを保持する文字列ではなくfoo
、Python 式として解析可能なフラグメントであることに注意してください。
したがって、eval(variable)
Winpdb コンソールはeval("(variable)")
対話型インタープリターと似ています。(variable)
これは、対話型インタープリターの場合とほぼ同じです。と同等variable
です。
ただし、対話型インタープリターでvariable
(または(variable)
または) と入力すると、メソッドを呼び出す がeval("(variable)")
出力されます。Winpdb でそれが起こらないのはなぜですか?repr(variable)
__repr__
対話型インタープリターで入力した式の出力repr
は、言語ではなく対話型インタープリターの機能であるためです。Winpdb コンソールでも同じことができますが、そうではありません。(これにより、__repr__
メソッドの問題をデバッグすることが可能になり、明示的にせずにデバッガーでデバッグ対象からコードを実行することを回避できます。)
では、どうでしょうかeval(variable.__repr__())
。ご想像のとおり、これはデバッグ対象で文字列"(variable.__repr__())"
を評価するようなものです。それ.__repr__()
は最終的にデバッグ対象環境で評価する式の一部になるため、もちろんデバッグ対象環境で呼び出されます。結果はUserDict
、以前のバージョンのようにオブジェクトではなく、文字列です。
最後に、Winpdb の Repr 列と呼び出しの結果として正確に何が表示されるのeval
でしょうか? まあ、それは実際には明示的に文書化されていないので、試行錯誤して理解するか、ソースを読むことができます.