【问题标题】:Is there a way to directly "decorate" a block of Python code?有没有办法直接“装饰”一段 Python 代码?
【发布时间】: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()?我的理解是,您不打算通过替换其后的语句来修改行为。所以,你可能想多了。此外,如果您想维护需要执行语句的范围,上下文管理器可能会很有用。

标签: python python-decorators


【解决方案1】:

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

【讨论】:

  • 我以前从未构建过上下文管理器,但结果证明它非常简单,而且确实正是我所需要的。谢谢!
猜你喜欢
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 2019-04-03
  • 1970-01-01
相关资源
最近更新 更多