pdb++,pdb的替代品
pdbpp的Python项目详细描述
PDB++,PDB的替代品
这是什么?
此模块是标准库的pdb模块的扩展。它是
本打算与它的前身完全兼容,但它引入了一个数字
使您的调试体验尽可能美好的新功能。
PDB++
功能包括:
< Buff行情>
-
python表达式的彩色制表符补全(通过fancycompleter
fancycompleter
)
-
代码列表的可选语法突出显示(通过
pygments
)
-
粘滞模式
-
从交互式提示中使用的几个新命令
-
智能命令解析
(提示:您是否曾在
是否提示打印某个变量的值?)
-
pdb
模块中的附加便利功能,从
您的程序
pdb++
意味着取代
pdb
。如果你找到一些
意外行为,请报告为错误。
安装
由于
pdb++
不是
pip
和
easy_install
的有效标识符,
该软件包名为
pdbpp
:
$ pip install pdbpp
-- OR --
$ easy_install pdbpp
pdb++
也可以通过conda获得
$ conda install -c conda-forge pdbpp
或者,您可以将
pdb.py
放在
蟒蛇
用法
注意,该模块被称为
pdb.py
,这样
pdb++
将自动
在所有需要导入pdb的地方使用(例如,pytest
给您一个
pdb++
提示。
旧的
pdb
模块仍然可用,方法是执行导入pdb;
pdb.pdb.set_trace()
新的交互式命令
以下是您可以从Interactive中使用的新命令
(PDB++)
提示。
-
粘性[开始-结束]
-
切换粘性模式。在这种模式下,每次
更改后,屏幕将重新绘制并显示整个功能。因此,当
执行分步执行可以很容易地遵循
执行。如果给定了
开始
和
结束
,则启用粘滞模式并
仅显示该范围内的行(包括极端值)。
-
长列表
(
ll
)
-
列出当前函数的源代码。不同于普通PDB
list
命令,
longlist
显示整个函数。当前
行用
->;
标记。如果是事后调试,则
实际引发的异常用
>;
标记。如果
突出显示
设置了配置选项,并安装了pygments,源代码
代码突出显示。
-
相互作用
-
启动一个interactive解释器,它的全局命名空间包含
在当前作用域中找到的名称。
-
轨迹表达式
-
显示一个图表,显示哪些对象是e的值xPression引用
并被推荐给。此命令要求
pypy
源代码
重要。
-
显示表达式
-
将表达式添加到显示列表中;此列表中的表达式包括
在每个步骤进行评估,并在其值每次更改时打印。
警告
:由于这些表达式被多次求值,请确保
不将有副作用的表达式放入显示列表。
-
展开表达式
:
-
从显示列表中删除表达式
。
-
源表达式
-
显示给定函数/方法/类的源代码。
-
编辑表达式
-
在正确的位置打开编辑器以编辑给定的
函数/方法/类。使用的编辑器在a
配置中指定
选项
-
高频隐藏
,
高频隐藏
,
高频列表
-
某些帧可能被标记为"隐藏",例如使用
函数装饰器。默认情况下,隐藏帧不显示在堆栈中
使用
向上
和
向下
无法访问。你可以使用
hf_unhide
告诉pdb忽略隐藏状态(即,处理隐藏状态
帧作为普通帧),然后
hf_hide
再次隐藏它们。
高频列表
打印隐藏帧的列表。
配置选项
启用隐藏框架
可用于禁用处理
总的来说是隐藏的帧。
智能命令分析
默认情况下,pdb试图解释您在命令提示下输入的内容
作为其内置命令之一。但是,如果你想
只需打印一个碰巧同名的局部变量的值
作为命令之一。例如:
(Pdb) list
1
2 def fn():
3 c = 42
4 import pdb;pdb.set_trace()
5 -> return c
(Pdb) c
在上面的例子中,pdb将输入解释为
命令继续,然后松开提示。甚至比
这是因为即使你输入了例如
c.\uuu class\uu
pdb++不友好地解决了这个问题(从作者的角度来看,当然是:-)
在作用域中始终首选变量(如果存在)的行为。如果你真的
要执行相应的命令,可以在它前面加上
!!
因此,上面的示例变成:
(Pdb++) list
1
2 def fn():
3 c = 42
4 import pdb;pdb.set_trace()
5 -> return c
(Pdb++) c
42
(Pdb++) !!c
请注意,"聪明"的行为只有在存在歧义时才会发生,即。
如果存在与命令同名的变量:在所有其他变量中
箱子,一切照常工作。
关于
list
命令本身,使用
list(…
是一种特殊情况
它被当作python内置函数处理:
(Pdb++) list([1, 2])
[1, 2]
pdb
模块中的附加功能
pdb++附带的
pdb
模块包括所有函数和
标准库中模块中的类。如果你找到了
不同之处,请报告为错误。
此外,还有一些新的便利功能
PDB++.
< DL>
pdb.xpm()
延长尸检时间:相当于
pdb.post_mortem(sys.exc_info()[2])
。如果在
内部使用,除了
子句,它将从引发
捕获到异常。
pdb.disable()
禁用
pdb.set_trace()
:对它的任何后续调用都将被忽略。
pdb.enable()
重新启用pdb.set_trace()
,以防被
pdb.disable()
禁用
-
@pdb.hideframe
-
告诉pdb++隐藏与
功能。使用交互式命令时,隐藏的帧不会显示,例如
如
向上
,
向下
或
其中
,除非调用了
hf_unhide
。
-
@pdb.break_打开setattr(attrname,condition=always)
类装饰器:每次
属性
attrname
在类的任何实例上设置。
条件是
获取
setattr
的目标对象和实际值的可调用函数;
默认情况下,每次设置属性时都会中断。例如:
@break_on_setattr('bar')
class Foo(object):
pass
f = Foo()
f.bar = 42 # the program breaks here
即使类已经创建,也可以使用if,例如,如果我们
希望在设置特定对象的某些属性时中断:
class Foo(object):
pass
a = Foo()
b = Foo()
def break_if_a(obj, value):
return obj is a
break_on_setattr('bar', condition=break_if_a)(Foo)
b.bar = 10 # no break
a.bar = 42 # the program breaks here
这可以在pdb之后使用。set_trace()
也可以:
(Pdb++) import pdb
(Pdb++) pdb.break_on_setattr('tree_id')(obj.__class__)
(Pdb++) continue
配置和定制
要自定义pdb++,可以将名为
.pdbrc.py
的文件放在家中
目录。文件必须包含一个名为
config
的类,该类继承自
pdb.defaultconfig
并覆盖所需值。
以下是您可以自定义的选项列表,以及它们的
默认值:
< DL>
提示=
'(PDB++)
'
在交互模式下显示的提示。
突出显示=真
在显示
一个函数或当处于粘性模式时
编码=
'utf-8'
文件编码。当字符串中有国际字符时很有用
文字或注释。
粘滞默认值=假
确定PDB++是否以粘性模式启动。
行号=颜色。绿松石色
用于行号的颜色。
文件名颜色=黄色
打印堆栈项时用于文件名的颜色。
当前线路
ANSI转义序列的SGR参数,以突出显示当前
线。
这是在sgr转义序列中设置的,其中
\e[%sm
是
esc字符和给定值。请参见sgr参数。
以下是"重置所有颜色"(
0
),将前景色设置为18
(
48;5;18
),以及
21
的背景。
默认使用默认前景(
39
)和背景(
49
)
颜色,反转(
7
)。
使用pygments=true
如果安装了pygments并且
highlight==true
,则应用语法highlight
当显示函数的
长列表或
粘性模式
bg='暗'
直接传递给
pygments.formatters.terminalformatter
构造函数。
选择要使用的颜色方案,具体取决于
终端。如果有浅色背景,请尝试将其设置为
"轻"
配色方案=无
直接传递给
pygments.formatters.terminalformatter
构造函数。
它需要一个将标记类型映射到(lightbg,darkbg)颜色名称或
无
(默认值:
无
=使用内置配色方案)。
编辑器=
'${editor:-vi}
使用编辑命令时要调用的命令。默认情况下,它使用
$editor
如果已设置,否则为vi
。命令必须支持标准
notation
command+n filename
在
n
行打开filename。
emacs
众所周知,
vi
支持这一点。
截断长线=真
截断超过终端宽度的行。
如果未聚焦=无,则执行
启动pdb提示符和终端时要执行的shell命令
窗口未聚焦。例如,播放声音提醒用户
前任程序的执行已停止。它需要
wmctrl
模块。
禁用pytest捕获=false
在
测试,但捕获标准输出(即,不使用
-s
选项,
这是默认行为)。当这个选项打开时,stdout
在显示交互式提示之前,捕获将被自动禁用。
启用隐藏的帧=真
默认情况下可以隐藏某些帧。
如果启用,命令可以是
用于控制它们的显示。
显示隐藏的帧数=真
如果enable_hidden_frames
为
真,则控制
显示隐藏的帧。
def设置(self,pdb):通过
在初始化
pdb
类期间调用此方法。有用的
进行复杂的设置。
在错误上显示回溯=真
通过
pdb.error
显示错误的回溯,这些错误来自
pdb.default(即执行无法识别的pdb命令),
并且不是表达式本身的直接原因(例如
nameerror
使用类似于
doesnotexist的命令。
如果禁用此选项,则只打印异常字符串
经常忽略有用的上下文。
在错误上显示回溯限制=无
此选项设置要与traceback.format_exception一起使用的限制,
当启用"在错误上显示回溯"时。
编码指南
pdb++
是使用测试驱动开发来开发的,我们试图保持测试
覆盖率高。
一般来说,每个提交都应该有自己的测试。如果是新的
功能,它应该附带一个或多个测试来执行它。如果是
错误修复后,测试应在修复前失败,并在修复后通过。
我们的目标是让重构在未来变得更容易:如果你想知道为什么
某些代码行做了一些事情,原则上应该可以
评论一下,看看哪些测试失败。
在特殊情况下,测试可能太难或无法编写:
这种情况下,不用测试就可以进行通信,但是你应该解释一下
在提交消息中非常准确地说明了为什么编写测试很困难以及如何
用手再现小车的行为。
在下列情况下不编写测试是可以的:
< Buff行情>
-
输入错误、文档,通常还有任何非编码提交
-
不添加任何功能的代码重构
-
提交修复已经失败的测试
-
承诺沉默警告
-
纯粹的外观更改,例如更改输出的颜色
这是什么?
此模块是标准库的pdb模块的扩展。它是 本打算与它的前身完全兼容,但它引入了一个数字 使您的调试体验尽可能美好的新功能。
PDB++ 功能包括:
< Buff行情>- python表达式的彩色制表符补全(通过fancycompleter fancycompleter )
- 代码列表的可选语法突出显示(通过 pygments )
- 粘滞模式
- 从交互式提示中使用的几个新命令
- 智能命令解析 (提示:您是否曾在 是否提示打印某个变量的值?)
- pdb 模块中的附加便利功能,从 您的程序
pdb++ 意味着取代 pdb 。如果你找到一些 意外行为,请报告为错误。
安装
由于 pdb++ 不是 pip 和 easy_install 的有效标识符, 该软件包名为 pdbpp :
$ pip install pdbpp -- OR -- $ easy_install pdbpp
pdb++ 也可以通过conda获得
$ conda install -c conda-forge pdbpp
或者,您可以将 pdb.py 放在 蟒蛇
用法
注意,该模块被称为 pdb.py ,这样 pdb++ 将自动 在所有需要导入pdb的地方使用(例如,pytest 给您一个 pdb++ 提示。
旧的 pdb 模块仍然可用,方法是执行导入pdb; pdb.pdb.set_trace()
新的交互式命令
以下是您可以从Interactive中使用的新命令 (PDB++) 提示。
- 粘性[开始-结束]
- 切换粘性模式。在这种模式下,每次 更改后,屏幕将重新绘制并显示整个功能。因此,当 执行分步执行可以很容易地遵循 执行。如果给定了 开始 和 结束 ,则启用粘滞模式并 仅显示该范围内的行(包括极端值)。
- 长列表 ( ll )
- 列出当前函数的源代码。不同于普通PDB list 命令, longlist 显示整个函数。当前 行用 ->; 标记。如果是事后调试,则 实际引发的异常用 >; 标记。如果 突出显示 设置了配置选项,并安装了pygments,源代码 代码突出显示。
- 相互作用
- 启动一个interactive解释器,它的全局命名空间包含 在当前作用域中找到的名称。
- 轨迹表达式
- 显示一个图表,显示哪些对象是e的值xPression引用 并被推荐给。此命令要求 pypy 源代码 重要。
- 显示表达式
- 将表达式添加到显示列表中;此列表中的表达式包括 在每个步骤进行评估,并在其值每次更改时打印。 警告 :由于这些表达式被多次求值,请确保 不将有副作用的表达式放入显示列表。
- 展开表达式 :
- 从显示列表中删除表达式 。
- 源表达式
- 显示给定函数/方法/类的源代码。
- 编辑表达式
- 在正确的位置打开编辑器以编辑给定的 函数/方法/类。使用的编辑器在a 配置中指定 选项
- 高频隐藏 , 高频隐藏 , 高频列表
- 某些帧可能被标记为"隐藏",例如使用 函数装饰器。默认情况下,隐藏帧不显示在堆栈中 使用 向上 和 向下 无法访问。你可以使用 hf_unhide 告诉pdb忽略隐藏状态(即,处理隐藏状态 帧作为普通帧),然后 hf_hide 再次隐藏它们。 高频列表 打印隐藏帧的列表。 配置选项 启用隐藏框架 可用于禁用处理 总的来说是隐藏的帧。
智能命令分析
默认情况下,pdb试图解释您在命令提示下输入的内容 作为其内置命令之一。但是,如果你想 只需打印一个碰巧同名的局部变量的值 作为命令之一。例如:
(Pdb) list 1 2 def fn(): 3 c = 42 4 import pdb;pdb.set_trace() 5 -> return c (Pdb) c
在上面的例子中,pdb将输入解释为 命令继续,然后松开提示。甚至比 这是因为即使你输入了例如 c.\uuu class\uu
pdb++不友好地解决了这个问题(从作者的角度来看,当然是:-) 在作用域中始终首选变量(如果存在)的行为。如果你真的 要执行相应的命令,可以在它前面加上 !! 因此,上面的示例变成:
(Pdb++) list 1 2 def fn(): 3 c = 42 4 import pdb;pdb.set_trace() 5 -> return c (Pdb++) c 42 (Pdb++) !!c
请注意,"聪明"的行为只有在存在歧义时才会发生,即。 如果存在与命令同名的变量:在所有其他变量中 箱子,一切照常工作。
关于 list 命令本身,使用 list(… 是一种特殊情况 它被当作python内置函数处理:
(Pdb++) list([1, 2]) [1, 2]
pdb 模块中的附加功能
pdb++附带的 pdb 模块包括所有函数和 标准库中模块中的类。如果你找到了 不同之处,请报告为错误。
此外,还有一些新的便利功能 PDB++.
< DL>- @pdb.hideframe
- 告诉pdb++隐藏与 功能。使用交互式命令时,隐藏的帧不会显示,例如 如 向上 , 向下 或 其中 ,除非调用了 hf_unhide 。
- @pdb.break_打开setattr(attrname,condition=always)
类装饰器:每次 属性 attrname 在类的任何实例上设置。 条件是 获取 setattr 的目标对象和实际值的可调用函数; 默认情况下,每次设置属性时都会中断。例如:
@break_on_setattr('bar') class Foo(object): pass f = Foo() f.bar = 42 # the program breaks here
即使类已经创建,也可以使用if,例如,如果我们 希望在设置特定对象的某些属性时中断:
class Foo(object): pass a = Foo() b = Foo() def break_if_a(obj, value): return obj is a break_on_setattr('bar', condition=break_if_a)(Foo) b.bar = 10 # no break a.bar = 42 # the program breaks here
这可以在pdb之后使用。set_trace() 也可以:
(Pdb++) import pdb (Pdb++) pdb.break_on_setattr('tree_id')(obj.__class__) (Pdb++) continue
配置和定制
要自定义pdb++,可以将名为 .pdbrc.py 的文件放在家中 目录。文件必须包含一个名为 config 的类,该类继承自 pdb.defaultconfig 并覆盖所需值。
以下是您可以自定义的选项列表,以及它们的 默认值:
< DL>通过 pdb.error 显示错误的回溯,这些错误来自 pdb.default(即执行无法识别的pdb命令), 并且不是表达式本身的直接原因(例如 nameerror 使用类似于 doesnotexist的命令。
如果禁用此选项,则只打印异常字符串 经常忽略有用的上下文。
编码指南
pdb++ 是使用测试驱动开发来开发的,我们试图保持测试 覆盖率高。
一般来说,每个提交都应该有自己的测试。如果是新的 功能,它应该附带一个或多个测试来执行它。如果是 错误修复后,测试应在修复前失败,并在修复后通过。
我们的目标是让重构在未来变得更容易:如果你想知道为什么 某些代码行做了一些事情,原则上应该可以 评论一下,看看哪些测试失败。
在特殊情况下,测试可能太难或无法编写: 这种情况下,不用测试就可以进行通信,但是你应该解释一下 在提交消息中非常准确地说明了为什么编写测试很困难以及如何 用手再现小车的行为。
在下列情况下不编写测试是可以的:
< Buff行情>- 输入错误、文档,通常还有任何非编码提交
- 不添加任何功能的代码重构
- 提交修复已经失败的测试
- 承诺沉默警告
- 纯粹的外观更改,例如更改输出的颜色