Python如何抽象方法中重复的初始化与收尾公共代码
推荐方案:使用上下文管理器(最优解)
这是最贴合你需求的实现方式,不需要将业务逻辑拆分为独立方法,公共逻辑完全抽离,代码可读性高还天然支持异常安全:
- 先基于
contextlib.contextmanager定义公共的初始化+收尾逻辑:
from contextlib import contextmanager @contextmanager def common_wrapper(): # 此处放所有公共初始化逻辑 runtime_vars = { "db_conn": get_db_connection(), "config": load_global_config(), # 其他所有初始化阶段生成的变量 } try: # 将初始化变量抛出给业务逻辑使用 yield runtime_vars finally: # 此处放所有公共收尾逻辑,哪怕中间业务代码报错也会正常执行 close_db_connection(runtime_vars["db_conn"]) clean_temp_file() # 其他收尾操作
- 在各个业务方法中直接调用即可,多行业务逻辑直接写在
with代码块内部,无需拆分:
def myFunc(): # myFunc自身的其他前置逻辑 with common_wrapper() as vars: # 此处直接写任意多行的独有业务逻辑,可直接调用vars里的初始化变量 cursor = vars["db_conn"].cursor() cursor.execute("SELECT * FROM test_table") result = cursor.fetchall() process_result(result) # 可以写任意多行业务代码 # myFunc自身的其他后置逻辑
可选方案:沿用原wrap思路,用内部嵌套函数代替lambda
如果你不想改原有的wrap实现结构,也可以在业务方法内部定义临时嵌套函数传入wrap,不需要把业务逻辑拆成全局独立方法:
def wrap(inner_method): vars = {initialise stuff} inner_method(vars) {finalise stuff} def myFunc(): # myFunc自身的其他前置逻辑 # 仅在myFunc内部生效的临时业务函数,不会污染全局空间,也不影响可读性 def do_stuff(vars): # 此处写任意多行的独有业务逻辑 print(vars["xxx"]) a = 1 b = 2 # 其他业务操作 wrap(do_stuff) # myFunc自身的其他后置逻辑
方案对比
更推荐使用上下文管理器方案:不需要额外定义内部函数,代码流程更连贯,且默认的try...finally结构能保证无论业务逻辑是否抛出异常,收尾逻辑都会正常执行,避免资源泄漏问题。
内容的提问来源于stack exchange,提问作者Jordan Barrett
相关产品推荐
相关产品推荐

