-1

再定義された UserDict クラスが__repr__あり__str__、それを WinPDB で使用していくつかのコードをデバッグしています。

class UserDict(dict):
    def __repr__(self):
        return "this is repr"
    def __str__(self):
       return "this is str"

variable = UserDict()
variable["abc"] = 1

これは、そのスクリプトのデバッグ セッションです。コンソールの注 2 コマンド:eval(variable)およびeval(variable.__repr__())、スクリプトの実行が最後の行に達したときに発行されます。 ここに画像の説明を入力

通常のpythonコンソールでは失敗するはずのWinPDBコンソールで言うとeval(variable)、「Repr」列と同じものが返されます。

その「Repr」列の内容をどのように埋め、実際に何をするのだろうeval(variable)か?

4

2 に答える 2

2

eval文字列を Python 式として評価するにはどうすればよいですか。

オブジェクトの表現を取得するためにオブジェクトを呼び出す必要はありませんevalpdb/は、オブジェクトの表現を取得するためにオブジェクトを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でしょうか? まあ、それは実際には明示的に文書化されていないので、試行錯誤して理解するか、ソースを読むことができます.

于 2013-10-15T22:03:57.017 に答える