python - 如何使装饰器对调试器透明

标签 python debugging decorator pudb

我正在开发一个装饰器库,该库正在修改函数的关键字参数,并且该库正在执行我想要它执行的操作,但是在调试时,每当调用用户函数时,调试器都必须这样做,这非常不方便传递装饰器库代码。

我将装饰器实现为一个类(请参阅 https://github.com/mapa17/configfy/blob/master/configfy/decorator.py )

用户函数由以下库代码包装:

def __call__(self, *args, **kwargs):
    if self.needs_wrapping:
        self.needs_wrapping = False
        self.func = args[0]
        functools.update_wrapper(self, self.func)
        self.kwargs = self.__get_kw_args(self.func)

        # If config file is specified in decorator, new kwargs can be precalculated!
        if self.config is not None:
            self.new_kwargs = self._get_new_kwargs()

        return self

    # Use precalculated kwargs if available
    if self.new_kwargs is None:
        new_kwargs = self._get_new_kwargs()
    else:
        new_kwargs = self.new_kwargs

    # Overwrite them with any passed arguments; passed arguments have priority!
    new_kwargs.update(kwargs)

    # Call target (aka user) function with altered kwargs
    return self.func(*args, **new_kwargs)

那么在调试时是否可以以某种方式跳过这个库代码?

最佳答案

装饰器并没有什么神奇之处。 @decorator 语法只是语法糖,因此当您编写时:

@decorate
def some_func(...):
   # ...

从技术上讲,真正发生的是:

def some_func(...):
   # ...

some_func = decorate(some_func)

IOW,不,没有办法“使装饰器对调试器透明”,因为“装饰器”只是一个普通的普通可调用函数,它(通常但不一定)返回另一个普通的普通可调用函数 - 事实上,只有没有“装饰器”这样的东西,如果你这样使用它,可调用就是一个装饰器,仅此而已。

关于python - 如何使装饰器对调试器透明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52225798/

相关文章:

python - 自修改Python类

python - 查看非常大的 CSV 文件的一部分?

python - 检测无限递归

python - 从 scipy 稀疏矩阵中提取非主对角线?

python - 使用 mock.patch 装饰器和 nose2 这样的 DSL

python - 函数如何知道调用函数的装饰器

python - 使用来自 2 个不同数据帧的单元格值进行计算(Pandas)

Scala 调试

python - 经验丰富的 Python 程序员(尤其是前 php 程序员): How do I debug python?

debugging - 如何使用 Voltron 为 LLDB 自定义 View ?