有没有办法直接“装饰”一段Python代码?

时间:2016-07-18 14:20:22

标签: python python-decorators

我有一堆代码:

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)

这样我就直接装饰语句而不是将它们包含在辅助块函数中。有没有办法实现这样的目标?

1 个答案:

答案 0 :(得分:5)

Context managers正是您所寻找的。您可以将它们与with语句一起使用,并定义在进入和退出with块时运行的代码。