Python将返回语句重定向到stdout



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

例如

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

更改sys.stdout只会影响print的功能。如何将其他表达式重定向到stdout?

感谢

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

因此,试图将函数返回值重定向到stdout是错误的做法

交互式解释器所做的事情有点像这样:

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

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

然而,这并不是真正所做的。你自己也不应该这样做。如果你尝试,你将不得不处理复杂的问题,比如保持你自己的globals与用户的分离,处理语句和表达式,处理多行语句和表达式(做raw_input(sys.ps2)很容易,但你怎么知道何时这样做?),与readlinerlcomplete正确交互,等等。

文档中有一节名为"自定义Python解释器",它解释了实现这一点的简单方法:

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

code:

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

这个想法是让Python做所有困难的事情,达到你想接管的任何级别,然后你只需要在上面写一部分。

您可能需要查看IDLEipythonbpython等的源代码以获取想法。

不要使用exec()来运行用户输入,而是尝试eval():

retval = eval(user_input)
sys.stdout.write(repr(retval) + "n")

最新更新