我正在使用 Elpy 在 Emacs 中运行 IPython3,并尝试动态编辑嵌套函数。例如,我在一个框架中打开附件,在另一个框架中打开 IPython3。我用 将缓冲区发送到 IPython C-c C-y b
,用 切换到 IPython 帧C-x o
。
import sys
def print_name():
print ("Alice")
def name ():
print_name()
def main(argv):
print ("In main.")
import ipdb; ipdb.set_trace()
name()
if __name__ == "__main__":
main(sys.argv[1:])
现在我通过键入来运行代码main(0)
。
In [1]: main(0)
In main.
> /Users/ayank/Documents/programming/python/bar.py(12)main()
11 import ipdb; ipdb.set_trace()
---> 12 name()
13
我得到一个调试提示并执行以下操作:
ipdb> name()
Alice
现在,我回到 的代码窗口print_name()
,更改Alice
为Bob
,然后将函数重新发送到 IPython3 和C-c C-y f
。我在 IPython 框架中看到以下内容:
ipdb> def print_name():
...: print ("Bob")
我回到 IPython 框架并输入:
ipdb> name()
Alice
ipdb> print_name()
Bob
这是不对的:两者都应该 print Bob
。我可以使用 将整个缓冲区重新发送到 IPython C-c C-y b
,但我得到了相同的答案:name()
总是输出Alice
。
这里发生了什么?调试时如何更新 IPython3 中的嵌套函数?