在块之前和之后运行一些公共代码

时间:2015-10-20 04:51:07

标签: python python-3.x

在当前的项目中,我发现自己经常编写这样的代码:

statement_x()

do_something()
do_other_thing()

statement_y()

# ...

statement_x()

do_third_thing()
do_fourth_thing()

statement_y()

正如您所看到的,statement_xstatement_y经常被重复,并且它们总是配对,但我无法将它们压缩成一个语句。我真正想要的是这样的语言结构:

def env wrapping:
    statement_x()

    run_code

    statement_y()

在这种情况下,我假装env是一个Python关键字,表示一个特殊的"三明治函数"在给定块之前和之后运行某些语句,块的输入点由第二个关键字run_code指示。

现在可以使用此构造使我的上述程序更具可读性:

env wrapping:
    do_something()
    do_other_thing()

env wrapping:
    do_third_thing()
    do_fourth_thing()

我的意思是完全相同的行为。

据我所知,这样的构造不存在,我的问题不在于推测未来的Python特性。但是,这种情况肯定会在变量块之前和之后运行一些公共代码。必须经常发生,Python有一个方便的方法来处理它!这是什么方式?或者Pythonic解决方案是简单的放弃并接受重复吗?

PS: 我意识到我可以编写一个将变量语句作为参数的函数,但这不会非常用户友好 - 我最终会在我的函数的内容中写下大量的语句列表。

1 个答案:

答案 0 :(得分:3)

您可以使用with statement

使用contextlib.contextmanager的示例:

import contextlib                                                               

@contextlib.contextmanager
def doing_xy():
    print('statement_x')
    yield
    print('statement_y')

使用示例:

>>> with doing_xy():
...     print('do_something')
...     print('do_other_thing')
... 
statement_x
do_something
do_other_thing
statement_y
>>> with doing_xy():
...     print('do_third_thing')
...     print('do_fourth_thing')
... 
statement_x
do_third_thing
do_fourth_thing
statement_y