Python将return语句重定向到stdout

时间:2013-02-05 20:34:50

标签: python

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

E.g。

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

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

谢谢

2 个答案:

答案 0 :(得分:1)

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

因此,尝试将函数返回值重定向到stdout是不对的。

交互式解释器的作用是这样的:

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

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

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

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

  

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

code

  

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

我们的想法是让Python完成所有难题,直到你想要接管的任何级别,然后你只需要编写部分。

您可能需要查看IDLEipythonbpython等来源,了解相关信息。

答案 1 :(得分:0)

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

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