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

时间:2019-05-31 13:39:46

标签: python logging decorator

您现在可能会看到装饰器的常见用法,例如:

@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装饰器的手工日志(...)条目。 因此,它很容易在测试后删除,因此记录不会浪费时间。

但是可以将其仅挂在代码行上吗? 例如for循环等,例如:

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

将行视为函数的软函数,以某种形式的args访问x,无论什么(行中的变量和代码)实际上导致所有内容都是python中的函数?

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

这个想法是简要记录每行中发生的事情,而无需大量的手写日志条目,例如 log.info(信息) 在许多行代码中

对此有何想法? 我试图检查该功能。 __代码__内置,但是它的python字节代码在那里,而不是源代码...

3 个答案:

答案 0 :(得分:2)

这正是上下文管理器的用途。这些由function percentExtender() { var tickColor = "#666"; var gridlineColor = "rgba(0,0,0,0.1)"; this.cfg.config.options = { tooltips: { callbacks: { label: function (tooltipItem, data) { return " " + (tooltipItem.yLabel*100).toFixed(1) + "%"; } } }, scales: { yAxes: [{ display: true, scaleLabel: { display: true, labelString: 'Return', fontColor: tickColor }, ticks: { // add $ to y axis label callback: function (value, index, values) { value = value * 100; return value + " %"; }, fontColor: tickColor }, gridLines: { color: gridlineColor } }] } }; }; 块触发,并定义了在进入和退出该块时运行的代码。

请参见the documentation

答案 1 :(得分:0)

不,装饰器只能包装函数。

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

def func(...):
    ...

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

    #call decorated function
    _f()

答案 2 :(得分:0)

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

Python Decorator for printing every line executed by a function

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