0

我正在使用 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(),更改AliceBob,然后将函数重新发送到 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 中的嵌套函数?

4

1 回答 1

0

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

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

代码运行示例:

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
于 2019-01-14T17:11:38.503 回答