0

我正在编写一个 Python 解释器,并希望将函数的返回值重定向到标准输出,例如交互模式下的 Python 解释器。在这种模式下,当用户调用一个函数时,它的返回值会打印在屏幕上。表达式也是如此。

例如

>>> foo()
'Foo return value'
>>> 2+4
6
>>> print('Hello!')
'Hello!'

更改sys.stdoutonly 会影响print功能。如何将其他表达式重定向到标准输出?

谢谢

4

2 回答 2

1

首先,交互模式不会打印任何调用函数的返回值。相反,它会打印用户输入的任何表达式的结果。如果这不是函数调用,它仍然会被打印。如果它有 3 个函数调用,它仍然会打印一个结果,而不是 3 行。等等。

因此,尝试将函数返回值重定向到标准输出是错误的做法。

交互式解释器的工作类似于这样:

line = raw_input(sys.ps1)
_ = eval(line)
if _ is not None:
    print repr(_)

(您可能会注意到,您可以sys.ps1从交互式提示中更改以更改提示的外观,访问_以获取最后一个值等)

然而,这并不是它真正的作用。这也不是你自己应该做的事情。如果您尝试,您将不得不处理复杂性,例如将您自己的globals与用户的分开、处理语句和表达式、处理多行语句和表达式(做起来raw_input(sys.ps2)很容易,但您怎么知道什么时候做呢? ),与readlineandrlcomplete等进行适当的交互。

文档中有一个名为Custom Python Interpreters的部分解释了执行此操作的简单方法:

本章描述的模块允许编写类似于 Python 的交互式解释器的接口。如果你想要一个除了 Python 语言之外还支持一些特殊功能的 Python 解释器,你应该查看该code模块。

并且code

... 提供了在 Python 中实现 read-eval-print 循环的工具。包括两个类和便利功能,可用于构建提供交互式解释器提示的应用程序。

这个想法是你让 Python 完成所有困难的事情,直到你想要接管的任何级别,然后你只需在此之上编写部分。

您可能想查看 、 、 等的来源以IDLE获得ipython想法bpython

于 2013-02-05T22:35:12.977 回答
0

而不是exec()用于运行用户输入,请尝试eval()

retval = eval(user_input)
sys.stdout.write(repr(retval) + "\n")
于 2013-02-05T20:36:57.920 回答