pdb++,pdb的替代品

pdbpp的Python项目详细描述


PDB++,PDB的替代品

这是什么?

此模块是标准库的pdb模块的扩展。它是 本打算与它的前身完全兼容,但它引入了一个数字 使您的调试体验尽可能美好的新功能。

https://github.com/antocuni/pdb/blob/master/screenshot.png?raw=true

PDB++ 功能包括:

< Buff行情>

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行情>
  • 输入错误、文档,通常还有任何非编码提交
  • 不添加任何功能的代码重构
  • 提交修复已经失败的测试
  • 承诺沉默警告
  • 纯粹的外观更改,例如更改输出的颜色

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何使用jaxb整理集合?   java改装添加带有令牌和id的标头   Java Webstart在启动应用程序之前停止   mysql将请求主体作为JSON存储到Java数据库中   春天3。从Java 7更新到Java 8后x应用程序不工作   java如何为我的mock实例化unirest HttpResponse<JsonNode>?   java两个servlet在同一场战争中与两场独立战争中的利弊?   java Mockito验证未失败   GWT中的java文件读取器   java避免代码重复   java谁将设置saml cookie,其中包含凭证信息   java如何修改jar包代码,然后重新导出更新的jar包?   BST数据结构中的java递归差异   java如何从文本文件中读取存储的哈希表?   带有quercus的java php comet   java从SeleniumWebDriver写入json变量   javascript如何在同一个action类中对方法调用action?