我使用Elpy在Emacs中运行IPython3,并尝试动态编辑嵌套函数。例如,我在一个帧中打开了附件,而在另一个帧中打开了IPython3。我用C-c C-y b把buffer发送到IPython,用C-x o切换到IPython帧。
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,并使用C-c C-y f将函数重新发送给IPython3。我看到以下内容出现在IPython框架中:
ipdb> def print_name():
...: print ("Bob")我返回到IPython框架并输入:
ipdb> name()
Alice
ipdb> print_name()
Bob这是不对的:两者都应该打印Bob。我可以用C-c C-y b将整个缓冲区重新发送到IPython,但是我得到了相同的答案:name()总是输出Alice。
这里发生了什么事?如何在调试时更新IPython3中的嵌套函数?
发布于 2019-01-15 01:11:39
问题是,当执行命中断点时,在main命名空间中执行在ipdb提示符处键入的代码。因此,新的print_name()在main名称空间中,而name()继续在global名称空间中调用print_name()。
可以通过键入globals()['print_name'] = print_name将新的print_name()手动添加到global名称空间。
代码的运行示例:
ayank@snorri$ ./foo.py
In main.
> /Users/ayank/Documents/programming/python/bar.py(13)main()
12 import ipdb; ipdb.set_trace()
---> 13 name()
14
ipdb> print_name()
Alice
ipdb> name()
Alice
ipdb> def print_name(): print ("Bob")
ipdb> print_name()
Bob
ipdb> name()
Alice
ipdb> globals()["print_name"] = print_name
ipdb> name()
Bobhttps://stackoverflow.com/questions/54153888
复制相似问题