我正在编写一个 Python 解释器,并希望将函数的返回值重定向到标准输出,例如交互模式下的 Python 解释器。在这种模式下,当用户调用一个函数时,它的返回值会打印在屏幕上。表达式也是如此。
例如
>>> foo()
'Foo return value'
>>> 2+4
6
>>> print('Hello!')
'Hello!'
更改sys.stdout
only 会影响print
功能。如何将其他表达式重定向到标准输出?
谢谢
我正在编写一个 Python 解释器,并希望将函数的返回值重定向到标准输出,例如交互模式下的 Python 解释器。在这种模式下,当用户调用一个函数时,它的返回值会打印在屏幕上。表达式也是如此。
例如
>>> foo()
'Foo return value'
>>> 2+4
6
>>> print('Hello!')
'Hello!'
更改sys.stdout
only 会影响print
功能。如何将其他表达式重定向到标准输出?
谢谢
首先,交互模式不会打印任何调用函数的返回值。相反,它会打印用户输入的任何表达式的结果。如果这不是函数调用,它仍然会被打印。如果它有 3 个函数调用,它仍然会打印一个结果,而不是 3 行。等等。
因此,尝试将函数返回值重定向到标准输出是错误的做法。
交互式解释器的工作类似于这样:
line = raw_input(sys.ps1)
_ = eval(line)
if _ is not None:
print repr(_)
(您可能会注意到,您可以sys.ps1
从交互式提示中更改以更改提示的外观,访问_
以获取最后一个值等)
然而,这并不是它真正的作用。这也不是你自己应该做的事情。如果您尝试,您将不得不处理复杂性,例如将您自己的globals
与用户的分开、处理语句和表达式、处理多行语句和表达式(做起来raw_input(sys.ps2)
很容易,但您怎么知道什么时候做呢? ),与readline
andrlcomplete
等进行适当的交互。
文档中有一个名为Custom Python Interpreters的部分解释了执行此操作的简单方法:
本章描述的模块允许编写类似于 Python 的交互式解释器的接口。如果你想要一个除了 Python 语言之外还支持一些特殊功能的 Python 解释器,你应该查看该
code
模块。
并且code
:
... 提供了在 Python 中实现 read-eval-print 循环的工具。包括两个类和便利功能,可用于构建提供交互式解释器提示的应用程序。
这个想法是你让 Python 完成所有困难的事情,直到你想要接管的任何级别,然后你只需在此之上编写部分。
而不是exec()
用于运行用户输入,请尝试eval()
:
retval = eval(user_input)
sys.stdout.write(repr(retval) + "\n")