如何用Pythonic方式实现以A(x)、B(x)包裹批量命令?
Pythonic 实现命令前后统一执行A(x)和B(x)
方案1:使用上下文管理器(推荐,适合语句块场景)
上下文管理器是处理这类"前置-执行-后置"流程最优雅的方式,它能自动管理前置和后置操作,还能保证后置操作在异常情况下也会执行。用contextlib.contextmanager快速实现:
from contextlib import contextmanager @contextmanager def wrap_commands(x): # 执行前置操作A(x) A(x) try: yield # 此处会运行with块内的所有命令 finally: # 执行后置操作B(x),不受Cn是否报错影响 B(x) # 使用示例 fixed_x = "你的固定参数" # 包裹C0、C1 with wrap_commands(fixed_x): C0 # 这里写你的C0命令 C1 # 这里写你的C1命令 # 单独包裹C2 with wrap_commands(fixed_x): C2 # 这里写你的C2命令
方案2:包装函数(适合单个/批量可调用命令)
如果你的C0、C1是可调用函数,写一个通用包装函数来统一处理流程:
def execute_with_wrapper(x, command): A(x) try: command() finally: B(x) # 使用示例 fixed_x = "你的固定参数" # 执行单个命令C0 execute_with_wrapper(fixed_x, C0) # 批量执行C1和C2,用lambda打包 execute_with_wrapper(fixed_x, lambda: (C1(), C2()))
方案3:装饰器(适合批量给函数添加包装)
如果C0、C1都是需要反复调用的独立函数,用装饰器一次性给它们加上前置和后置操作:
def add_wrapper(x): def decorator(func): def wrapper(*args, **kwargs): A(x) try: return func(*args, **kwargs) finally: B(x) return wrapper return decorator # 使用示例 fixed_x = "你的固定参数" @add_wrapper(fixed_x) def C0(): # 原C0的业务逻辑 pass @add_wrapper(fixed_x) def C1(): # 原C1的业务逻辑 pass # 直接调用函数,自动触发A(x)→Cn→B(x) C0() C1()
内容的提问来源于stack exchange,提问作者thyeme
相关产品推荐
相关产品推荐

