我正在开发一个装饰器库,该库正在修改函数的关键字参数,并且该库正在执行我想要它执行的操作,但是在调试时,每当调用用户函数时,调试器都必须这样做,这非常不方便传递装饰器库代码。
我将装饰器实现为一个类(请参阅 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/