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