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?好吧,这并没有真正明确地记录下来,因此您可以通过反复试验来弄清楚,或者阅读源代码。