Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Run some common code before and after a block

In a current project, I found myself often writing code like so:

statement_x()

do_something()
do_other_thing()

statement_y()

# ...

statement_x()

do_third_thing()
do_fourth_thing()

statement_y()

As you can see, statement_x and statement_y often get repeated, and they are always paired, but I am unable to condense them into a single statement. What I would really like is a language construct like this:

def env wrapping:
    statement_x()

    run_code

    statement_y()

In this case, I'm pretending env is a Python keyword indicating a special "sandwich function" that runs certain statements before and after a given block, the point of entry of the block being indicated by the second keyword run_code.

My above program can now be made more readable using this construct:

env wrapping:
    do_something()
    do_other_thing()

env wrapping:
    do_third_thing()
    do_fourth_thing()

Which I mean to have the exact same behavior.


As far as I know such a construct does not exist, and the point of my question is not to speculate on future Python features. However, surely this situation of "run some common code before and after a variable block" must occur often enough that Python has a convenient way of dealing with it! What is this way? Or is the Pythonic solution to simple give up and accept the repetition?

PS: I realize that I could write a function that takes the variable statements as an argument, but that would not be very user-friendly - I would end up writing huge lists of statements inside the parens of my function.

like image 494
Superbest Avatar asked Mar 17 '26 09:03

Superbest


1 Answers

You can use a with statement.

Example using contextlib.contextmanager:

import contextlib                                                               

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

Example usage:

>>> 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
like image 169
falsetru Avatar answered Mar 18 '26 23:03

falsetru



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!