是否可以将装饰器应用于Python中的一行?

问题描述 投票:0回答:4

正如你现在可能看到的,装饰器的常见用法是:

@log
def func(...)

实际上以 func 作为参数返回一个以 func 作为参数的函数,例如:

def log(func):
    def function_wrapper(*args , **kwargs):
    log_enter_func(func, args, kwargs)

    result = func(*args, **kwargs)
    log_exit_func(func, result )
    return result 

在上面的代码中,函数调用和返回的日志记录很好,不需要手工制作 log (...) 条目,只需在函数上使用 @log 装饰器。 所以测试后很容易删除,所以记录不消耗时间。

但是是否可以将其仅挂在代码行上? 就像 for 循环等,所以像 :

def func(...):
 ...
@log
    for x in range(whatever)

将该行视为函数的软函数,访问 x 的一些参数,无论什么(行中的变量和代码)导致实际上一切都是 python 中的函数?

或者也许有某种方法可以将装饰器应用于方法并将其传播到函数中的源代码行?

这个想法是对每一行发生的事情进行简短的记录,而不需要大量的手写日志条目,例如 日志信息(消息) 在很多行代码中

对此有什么想法吗? 我尝试检查该功能。 __ code __ 内置,但它是 python 字节码,而不是源代码...

python logging decorator
4个回答
3
投票

这正是上下文管理器的用途。这些由

with
块触发,并定义在进入和退出块时运行的代码。

请参阅文档


1
投票

不,装饰器仅用于包装函数。

也就是说,您可以在函数内运行您的行,然后使用装饰器。

def func(...):
    ...

    @log
    def _f(): #you can define this inside func() if you want
        for x in range(whatever):
            ...

    #call decorated function
    _f()

1
投票

虽然可能无法使用装饰器来处理函数的每一行,但我认为您可以使用以下方法记录每一行:

Python 装饰器用于打印函数执行的每一行

这个想法是创建一个调试上下文,然后是 debug_context 函数周围的调试装饰器包装器。这将创建一个局部变量日志到 std.out


0
投票

这可能会派上用场,尽管我不确定是否有人以这种方式实现了日志记录模块。寻找 Thomas Kühn 答案的编辑 2:

如何在 Python 中跟踪局部变量的值?

© www.soinside.com 2019 - 2024. All rights reserved.