在当前的项目中,我发现自己经常编写这样的代码:
statement_x()
do_something()
do_other_thing()
statement_y()
# ...
statement_x()
do_third_thing()
do_fourth_thing()
statement_y()
正如您所看到的,statement_x
和statement_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: 我意识到我可以编写一个将变量语句作为参数的函数,但这不会非常用户友好 - 我最终会在我的函数的内容中写下大量的语句列表。
答案 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