如何将函数内部逻辑与tqdm进度条展示逻辑分离?
如何将业务逻辑与tqdm进度展示逻辑分离?
你当前的实现把进度控制的if-else和verbose参数耦合在业务函数里,确实会让函数职责不清晰。完全可以把展示逻辑彻底剥离到函数外部,以下是两种简洁的实现方式:
方法1:让函数接收外部传入的迭代器
把业务函数改成依赖外部提供的迭代对象,函数内部只负责处理循环逻辑,完全不关心迭代器是否带进度条:
from tqdm import trange from time import sleep # 纯业务逻辑函数,无任何进度控制代码 def my_function(iterable): for i in iterable: # 这里写你的核心业务逻辑,示例用sleep代替 sleep(0.01) # 调用方控制是否显示进度 verbose = True if verbose: my_function(trange(100)) # 传入带进度条的迭代器 else: my_function(range(100)) # 传入普通迭代器
方法2:将业务逻辑封装为生成器,外部用tqdm包裹
如果业务函数的循环逻辑无法拆分出迭代器传入,可以把函数改成生成器,让调用方决定是否用tqdm包装迭代过程:
from tqdm import tqdm from time import sleep # 纯业务逻辑生成器,只产出每一步的结果或状态 def my_function(): for i in range(100): # 核心业务逻辑 sleep(0.01) yield i # 外部控制进度展示 verbose = True if verbose: # 用tqdm包裹生成器,指定总数量确保进度条正确 for _ in tqdm(my_function(), total=100): pass else: # 直接迭代生成器,无进度条 for _ in my_function(): pass
这两种方式都彻底实现了业务逻辑与进度展示的解耦,函数只专注于核心功能,进度控制完全由调用方决定,符合你想要的调用逻辑风格。
内容的提问来源于stack exchange,提问作者Johannes Wiesner
相关产品推荐
相关产品推荐

