【发布时间】:2018-05-16 15:02:00
【问题描述】:
我一直在挖掘源代码以找出打印结果的时间点。例如:
>>> x = 1
>>> x + 2
3
以上两条语句编译为:
1 0 LOAD_CONST 0 (1)
3 STORE_NAME 0 (x)
6 LOAD_CONST 1 (None)
9 RETURN_VALUE
和
1 0 LOAD_NAME 0 (x)
3 LOAD_CONST 0 (2)
6 BINARY_ADD
7 RETURN_VALUE
第一条语句不打印任何内容,因为None 是返回值。第二个返回加法的结果。
CPython 的交互式循环为每个输入调用 PyRun_InteractiveOneObjectEx()。这个gets the AST 并在虚拟机中调用run_mod() 到compile that AST to byte code 然后evaluate the result。 PyRun_InteractiveOneObjectEx() 得到的返回 Python 对象就是 top of the VM's stack。
到目前为止,这一切都是我所期望的。但是随后返回的值似乎是thrown away! REPL 什么时候打印出来的?
顺便说一句,我可以看到交互模式确实改变了分词器;它是invokes PyOS_Readline 和sys.ps1 提示符(默认为">>> ")。我检查了pythonrun.c 中的类似变化,但没有运气。
【问题讨论】:
标签: python cpython python-internals