【发布时间】:2016-11-21 04:50:43
【问题描述】:
我有一堆代码:
statement1(args)
statement2(args)
statement3(args)
statement4(args)
statement5(args)
我想将语句分成块并在每个块之后写入日志。日志记录有点复杂:我想记录每个块的运行时间和块执行后特定数据结构的状态。所以我创建了一个名为log_block 的装饰器来处理所有这些细节。现在我的代码如下所示:
@log_block()
def block1():
statement1(args)
statement2(args)
@log_block()
def block2()
statement3(args)
@log_block()
def block3():
statement4(args)
statement5(args)
block1()
block2()
block3()
这很好用,但有点笨拙。我不得不分别调用三个块函数,这很烦人,如果我想在块之间共享一个变量,那么我要么必须给块函数参数和返回语句,要么使用全局变量,这两者都不是特别可口。我真正想要的是看起来像这样的语法:
@log_block()
statement1(args)
statement2(args)
@log_block()
statement3(args)
@log_block()
statement4(args)
statement5(args)
所以我直接装饰语句而不是将它们包含在辅助块函数中。有没有办法实现这样的目标?
【问题讨论】:
-
这不适用于装饰器。您是否查看过“上下文管理器”?
with log_block(): ... -
你想要达到什么目的?为什么不调用函数 log_block()?我的理解是,您不打算通过替换其后的语句来修改行为。所以,你可能想多了。此外,如果您想维护需要执行语句的范围,上下文管理器可能会很有用。