gpt4 book ai didi

python - 模拟 Python shell 的 "return value"行为

转载 作者:行者123 更新时间:2023-12-03 20:53:05 24 4
gpt4 key购买 nike

假设我有一个要评估的 Python 字符串的 JSON 列表。例如,也许我正在构建一个客户端-服务器 Python GUI。

常规 Python 解释器的一个方便之处是它显示每一行的“伪返回值”,如下所示:

 $ python3 -c "import code; code.interact()"
Python 3.7.7 (default, Mar 10 2020, 15:43:03)
(InteractiveConsole)
>>> import os; os.curdir
'.'

我不必要求打印“.”。它只是做到了。

在幕后,人们可以看到这是用 exec() 函数实现的:

https://github.com/python/cpython/blob/800a35c623bbcdb5793c7d7a4974524286311479/Lib/code.py#L90
    try:
exec(code, self.locals)
except SystemExit:
raise
except:
self.showtraceback()

奇怪的是那里没有明确的指令来输出 exec() 的结果。然而我们可以看到它确实输出了它。

我们可以看到这种行为是非常特定于上下文的,如下所示:
$ echo "5" | python3 -c "import code; code.interact()"
Python 3.7.7 (default, Mar 10 2020, 15:43:03)
(InteractiveConsole)
>>> 5
>>>
now exiting InteractiveConsole...
enter code here

我假设如果我深入研究 C 代码,我会看到它正在查询其上下文以查看是否输出该值。但它不会回答我的主要问题,即如何在任意上下文中模拟这种行为。

我如何才能从 Python 字符串中执行并获取“伪返回值”,而不管该字符串是表示表达式还是语句?

最佳答案

Python 编译器有一个 flag to keep track of whether Python is being run in interactive mode .

如果设置了这个标志,当编译器访问 AST 中的语句节点时,它 emits an extra PRINT_EXPR opcode .

口译员executes PRINT_EXPR 通过将表达式的结果从堆栈中弹出并将其作为参数传递给 sys.displayhook .展示钩打印 repr将此值转换为标准输出,除非该值为 None。它还将该值分配给 builtins._ .

(我猜当您通过管道将命令传递给 Python 时,行为不同的原因是它不处于交互模式。)

所以只要你在交互模式下运行Python,你就可以读取_的值。使用 exec 运行代码后内置内置。

关于python - 模拟 Python shell 的 "return value"行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62009018/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com