-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__()),当脚本执行到最后一行时发出: 在此处输入图像描述

如果我eval(variable)在 WinPDB 控制台中说,它应该在普通的 python 控制台中失败,它返回的结果与其“Repr”列中的相同。

我想知道,当我说它时,它如何填充“Repr”列的内容以及它的真正作用eval(variable)

4

2 回答 2

2

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)")),它会打印出repr(variable),它会调用您的__repr__方法。为什么在 Winpdb 中没有发生这种情况?

因为打印出repr您在交互式解释器中键入的任何表达式是交互式解释器的功能,而不是语言的功能。虽然 Winpdb 控制台可以做同样的事情,但事实并非如此。(这使得调试__repr__方法问题成为可能,并且避免了在调试器中运行来自被调试对象的代码而不使其显式。)

那么,怎么样eval(variable.__repr__())。正如您可能猜到的那样,这就像"(variable.__repr__())"在调试器中评估字符串一样。这.__repr__()最终成为您在调试对象环境中评估的表达式的一部分,因此它当然会在调试对象环境中调用。结果不是一个UserDict对象,就像之前的版本一样,而是一个字符串。


那么,最后,Winpdb 在其Repr 列中以及调用的结果究竟是什么eval?好吧,这并没有真正明确地记录下来,因此您可以通过反复试验来弄清楚,或者阅读源代码。

于 2013-10-15T22:03:57.017 回答
0

eval() 执行作为字符串传递的 python 代码。如果您希望您的 dict 返回“foo”,请使用 repr(myUserDictVariable)。

于 2013-10-15T22:05:56.100 回答