首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更新ipdb中的嵌套函数?

如何更新ipdb中的嵌套函数?
EN

Stack Overflow用户
提问于 2019-01-12 04:52:45
回答 1查看 92关注 0票数 0

我使用Elpy在Emacs中运行IPython3,并尝试动态编辑嵌套函数。例如,我在一个帧中打开了附件,而在另一个帧中打开了IPython3。我用C-c C-y b把buffer发送到IPython,用C-x o切换到IPython帧。

代码语言:javascript
复制
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)来运行代码。

代码语言:javascript
复制
In [1]: main(0)
In main.
> /Users/ayank/Documents/programming/python/bar.py(12)main()
     11     import ipdb; ipdb.set_trace()
---> 12     name()
     13 

我得到一个调试提示符,并执行以下操作:

代码语言:javascript
复制
ipdb> name()
Alice

现在,我返回到print_name()的代码窗口,将Alice更改为Bob,并使用C-c C-y f将函数重新发送给IPython3。我看到以下内容出现在IPython框架中:

代码语言:javascript
复制
ipdb> def print_name():
 ...:     print ("Bob")

我返回到IPython框架并输入:

代码语言:javascript
复制
ipdb> name()
Alice
ipdb> print_name()
Bob

这是不对的:两者都应该打印Bob。我可以用C-c C-y b将整个缓冲区重新发送到IPython,但是我得到了相同的答案:name()总是输出Alice

这里发生了什么事?如何在调试时更新IPython3中的嵌套函数?

EN

回答 1

Stack Overflow用户

发布于 2019-01-15 01:11:39

问题是,当执行命中断点时,在main命名空间中执行在ipdb提示符处键入的代码。因此,新的print_name()main名称空间中,而name()继续在global名称空间中调用print_name()

可以通过键入globals()['print_name'] = print_name将新的print_name()手动添加到global名称空间。

代码的运行示例:

代码语言:javascript
复制
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()
Bob
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54153888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档