我正在编写一个Python解释器,并希望将函数的返回值重定向到stdout,就像交互模式下的Python解释器一样。在此模式下,当用户调用函数时,其返回值将打印在屏幕上。表达式也是如此。
E.g。
>>> foo()
'Foo return value'
>>> 2+4
6
>>> print('Hello!')
'Hello!'
更改sys.stdout
只会影响print
功能。如何将其他表达式重定向到stdout?
谢谢
答案 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)
很容易,但是你怎么知道何时这样做?),与readline
和rlcomplete
等正确互动
有一个名为Custom Python Interpreters的文档部分解释了执行此操作的简便方法:
本章描述的模块允许编写类似于Python的交互式解释器的接口。如果你想要一个除了Python语言之外还支持某些特殊功能的Python解释器,你应该看一下
code
模块。
code
:
...提供了在Python中实现read-eval-print循环的工具。包含两个类和便利函数,可用于构建提供交互式解释器提示的应用程序。
我们的想法是让Python完成所有难题,直到你想要接管的任何级别,然后你只需要编写部分。
答案 1 :(得分:0)
不要使用exec()
来运行用户输入,请尝试eval()
:
retval = eval(user_input)
sys.stdout.write(repr(retval) + "\n")