带有 while 循环的函数的 `tqdm` 包装器

`tqdm` wrapper for function with while loop

我有一个长期存在的库函数,我无法编辑它运行一个 while 循环和 returns 一个值。本质上是这样的:

import time

def myfunc():
    i = 0
    while i < 5 * 1000:
        i += 1
        time.sleep(0.001)
    return i

有没有一种方法可以包装这个函数,也许是在一个装饰器中,这样它就可以传递给 tqdm 并吐出一个进度条?我不太确定如何实现这一点,因为我无法编辑 myfunc.

中的代码

我的目标是为 myfunc 制作一个进度条而不用触摸它。有人有什么建议吗?

没有合法的方法可以做到这一点,除非这个函数returns和Iterable/Generator。但是,当然,您可以在线程中启动该函数,然后通过执行

之类的操作来模拟加载
import time, tqdm, concurrent

def myfunc():
    i = 0
    while i < 5 * 1000:
        i += 1
        time.sleep(0.001)
    return i


def simulate_loading(background_function):
    with concurrent.futures.ThreadPoolExecutor() as executor:
        future = executor.submit(background_function)
        while not future.done():
            yield
            time.sleep(0.05)
        return future.result()

for _ in tqdm.tqdm(simulate_loading(myfunc)):
    pass
115it [00:05, 19.85it/s]