Files
2026-07-13 13:22:52 +08:00

56 lines
1.5 KiB
Python

from __future__ import annotations
import time
from collections.abc import Iterable, Iterator
import tqdm
class ShowProgress[T](Iterator[T]):
"""This is a simple wrapper around tqdm that includes a starting delay before printing."""
def __init__(
self,
iterable: Iterable[T],
total: int | None,
desc: str | None,
silent: bool,
start_delay: float,
) -> None:
self.iter = iter(iterable)
self.start_time = time.time()
self.pbar = None
self.total = total
self.desc = desc
self.start_delay = start_delay
self.silent = silent
self.unshown_count = 0
def __next__(self) -> T:
if self.pbar is None and time.time() - self.start_time > self.start_delay:
self.pbar = tqdm.tqdm(total=self.total, initial=self.unshown_count, desc=self.desc, disable=self.silent)
self.pbar.start_t = self.start_time # type: ignore[attr-defined]
if self.pbar is not None:
self.pbar.update(1)
else:
self.unshown_count += 1
try:
return next(self.iter)
except StopIteration:
if self.pbar is not None:
self.pbar.close()
raise
def __iter__(self) -> ShowProgress[T]:
return self
def show_progress[T](
iterable: Iterable[T],
total: int | None = None,
desc: str | None = None,
silent: bool = False,
start_delay: float = 10,
) -> ShowProgress[T]:
return ShowProgress(iterable, total, desc, silent, start_delay)