python - 如何在Python中调试: Why doesn't pdb descend into function call?

标签 python ipython pdb canopy

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

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

Canopy 代码编辑器中的

my_module.py:

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

在 IPython session 中:

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

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

最佳答案

io.open 是一个内置函数:

In [8]: import io

In [9]: type(io.open)
Out[9]: builtin_function_or_method

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

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

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

io.open(filename, mode='r', encoding='utf8')

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

In [15]: open
Out[15]: <function io.open>

关于python - 如何在Python中调试: Why doesn't pdb descend into function call?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34559786/

相关文章:

python - 使用 PyWinAuto(或其他任何工具)与任务栏上的隐藏图标进行交互

python - 获取 pdb 中的最后一个异常

python - 使用 pdb.set_trace() 时没有 readline 支持

python - VSCode 无法将 jupyter notebook 导出到 html

python - 在 PyCharm 中以拆分模式查看运行

python - 如何加载现有的 ipython 笔记本?

python - 我如何配置 IPython 5 以具有 IPython 3 的 readline、tab 完成、(缺少)语法高亮等? (self.IPython)

python - 如何让IPython Notebook不显示上一次 session 的结果?

r - 使用 `browser()` 时如何从命令行使用 R 的 `Rscript` 函数

python - 在pycharm中并行运行两个python脚本