有没有办法进入装饰函数,跳过装饰器代码

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到给定的装饰函数时跳过所有装饰器代码.

Pau*_*McG 6

如果装饰器纯粹用于记录或其他非功能行为,那么使其成为调试的无操作 - 在定义之后插入此代码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)


unh*_*ler 4

我认为你做不到。它将改变步骤的含义,使其变得非常不同。

但是,有一种方法可以实现与您想要的类似的效果。在装饰函数中设置一个断点,并在调用装饰函数之前设置一个断点。现在,禁用函数内的断点。

现在,当您运行代码时,只有当您到达您关心的特定调用时,它才会中断。一旦发生中断,请重新启用函数中的断点并继续执行。这将执行所有修饰代码并在修饰函数的第一行中断。