hre*_*ef_ 10 python decorator pdb
我有一个模块,用自定义装饰器装饰一些关键功能.
使用pdb调试这些函数通常有点痛苦,因为每次我进入一个装饰函数时,我首先必须逐步完成装饰器代码本身.
我当然可以将调试器设置为在我感兴趣的函数内断开,但作为关键函数,它们从很多地方被多次调用,因此我通常更喜欢在函数外部开始调试.
我试图用代码来说明它,但我不知道这是否有帮助:
def i_dont_care_about_this(fn):
@functiontools.wraps(fn)
def wrapper(*args, **kwargs):
return fn(*args, **kwargs)
return wrapper
@i_dont_care_about_this
def i_only_care_about_this():
# no use to set pdb here
def i_am_here():
import pdb; pdb.set_trace()
i_only_care_about_this()
Run Code Online (Sandbox Code Playgroud)
那么,有没有办法让我i_only_care_about_this从中i_am_here走出来而不经过i_dont_care_about_this?
基本上我想在使用s到(s)tep到给定的装饰函数时跳过所有装饰器代码.
如果装饰器纯粹用于记录或其他非功能行为,那么使其成为调试的无操作 - 在定义之后插入此代码i_dont_care_about_this:
DEBUG = False
# uncomment this line when pdb'ing
# DEBUG = True
if DEBUG:
i_dont_care_about_this = lambda fn : fn
Run Code Online (Sandbox Code Playgroud)
但是如果它包含实际的活动代码,那么你将不得不使用pdb方法来完成工作,例如在装饰器内部的代码中对pdb.set_trace进行条件化调用:
BREAK_FLAG = False
...
# (inside your function you want to debug)
if BREAK_FLAG:
import pdb; pdb.set_trace()
...
# at your critical calling point
BREAK_FLAG = True
Run Code Online (Sandbox Code Playgroud)
我认为你做不到。它将改变步骤的含义,使其变得非常不同。
但是,有一种方法可以实现与您想要的类似的效果。在装饰函数中设置一个断点,并在调用装饰函数之前设置一个断点。现在,禁用函数内的断点。
现在,当您运行代码时,只有当您到达您关心的特定调用时,它才会中断。一旦发生中断,请重新启用函数中的断点并继续执行。这将执行所有修饰代码并在修饰函数的第一行中断。
| 归档时间: |
|
| 查看次数: |
2031 次 |
| 最近记录: |