如何在Python中调试:为什么pdb不下降到函数调用?

Ben*_*own 2 python ipython pdb canopy

我发现了一个错误,其中io.open()应该传递'utf-8'而不是'utf8'. 下面的最小可执行代码。为什么 IPython 回溯不指示行号,为什么pdb既不报告函数调用存在错误io.open,也不报告代码中的任何内容io.openpdb我可以使用IPython 调试器或位于其之上的Canopy 调试器来做什么,以便更轻松地调试这个调试器?

检查我的 IPython 版本也很混乱。Canopy 包管理器报告 和 均已ipython 4.0.0-3安装ipython4 4.0.0-9,但import IPython后面的IPython.version_info计算结果为(2, 4, 1, '')

my_module.py在 Canopy 代码编辑器中:

import io
def my_function(filename):
    with io.open(my_other_function(filename), u'r', u'utf8')
def my_other_function(text):
    return u'modified' + text
Run Code Online (Sandbox Code Playgroud)

在 IPython 会话中:

In []: import pdb
In []: import my_module
In []: my_module.my_function(filename)

-------------------------------------------------------------------------
TypeError                 Traceback (most recent call last)
<ipython-input-5-4c50d9f6cb5c> in <module>()
----> 1 my_module.my_function(filename)

C:\my_module in my_function(filename)

TypeError: an integer is required 

In []: pdb.pm()
> c:\users\bbrown\documents\github\canvasapi-python\capi\my_module.py(3)my_function()
-> with io.open(my_other_function(filename), u'w', u'utf8') as filehandle:

(Pdb) up
> <ipython-input-14-f6d6cc2c1670>(1)<module>()
-> my_module.my_function('testjunk')

(Pdb) down
> c:\users\bbrown\documents\github\canvasapi-python\capi\my_module.py(3)my_function()
-> with io.open(my_other_function(filename), u'w', u'utf8') as filehandle:

(Pdb) args
filename = testjunk

(Pdb) down
*** Newest frame
Run Code Online (Sandbox Code Playgroud)

鉴于 作为'utf-8'一个参数工作得很好,TypeError除非源自 的代码open,否则 是令人惊讶的,但对 的调用open并未放置在堆栈上,至少不能从 进行导航pdb。感谢您帮助我和其他人学习如何更有效地调试!

Ble*_*der 5

io.open是一个内置函数:

In [8]: import io

In [9]: type(io.open)
Out[9]: builtin_function_or_method
Run Code Online (Sandbox Code Playgroud)

它不是用 Python 编写的,因此调试器无法调试任何内容。您的错误是由于传递到的参数不正确引起的io.open

open(file, mode='r', buffering=-1, encoding=None,
     errors=None, newline=None, closefd=True, opener=None) -> file object
Run Code Online (Sandbox Code Playgroud)

'utf-8'作为第三个参数传递,但由于buffering它应该是一个整数,因此该函数引发了一个描述性的TypeError. encoding您可以通过创建关键字参数来修复它:

io.open(filename, mode='r', encoding='utf8')
Run Code Online (Sandbox Code Playgroud)

此外,您不需要io显式导入该模块。内置函数open完全相同:

In [15]: open
Out[15]: <function io.open>
Run Code Online (Sandbox Code Playgroud)