Post-Local sync at 2025-06-23T22:46:07Z
This commit is contained in:
parent
9d33b42020
commit
9f97801b0d
1387 changed files with 250216 additions and 117 deletions
93
.venv/lib/python3.12/site-packages/tqdm/asyncio.py
Normal file
93
.venv/lib/python3.12/site-packages/tqdm/asyncio.py
Normal file
|
@ -0,0 +1,93 @@
|
|||
"""
|
||||
Asynchronous progressbar decorator for iterators.
|
||||
Includes a default `range` iterator printing to `stderr`.
|
||||
|
||||
Usage:
|
||||
>>> from tqdm.asyncio import trange, tqdm
|
||||
>>> async for i in trange(10):
|
||||
... ...
|
||||
"""
|
||||
import asyncio
|
||||
from sys import version_info
|
||||
|
||||
from .std import tqdm as std_tqdm
|
||||
|
||||
__author__ = {"github.com/": ["casperdcl"]}
|
||||
__all__ = ['tqdm_asyncio', 'tarange', 'tqdm', 'trange']
|
||||
|
||||
|
||||
class tqdm_asyncio(std_tqdm):
|
||||
"""
|
||||
Asynchronous-friendly version of tqdm.
|
||||
"""
|
||||
def __init__(self, iterable=None, *args, **kwargs):
|
||||
super().__init__(iterable, *args, **kwargs)
|
||||
self.iterable_awaitable = False
|
||||
if iterable is not None:
|
||||
if hasattr(iterable, "__anext__"):
|
||||
self.iterable_next = iterable.__anext__
|
||||
self.iterable_awaitable = True
|
||||
elif hasattr(iterable, "__next__"):
|
||||
self.iterable_next = iterable.__next__
|
||||
else:
|
||||
self.iterable_iterator = iter(iterable)
|
||||
self.iterable_next = self.iterable_iterator.__next__
|
||||
|
||||
def __aiter__(self):
|
||||
return self
|
||||
|
||||
async def __anext__(self):
|
||||
try:
|
||||
if self.iterable_awaitable:
|
||||
res = await self.iterable_next()
|
||||
else:
|
||||
res = self.iterable_next()
|
||||
self.update()
|
||||
return res
|
||||
except StopIteration:
|
||||
self.close()
|
||||
raise StopAsyncIteration
|
||||
except BaseException:
|
||||
self.close()
|
||||
raise
|
||||
|
||||
def send(self, *args, **kwargs):
|
||||
return self.iterable.send(*args, **kwargs)
|
||||
|
||||
@classmethod
|
||||
def as_completed(cls, fs, *, loop=None, timeout=None, total=None, **tqdm_kwargs):
|
||||
"""
|
||||
Wrapper for `asyncio.as_completed`.
|
||||
"""
|
||||
if total is None:
|
||||
total = len(fs)
|
||||
kwargs = {}
|
||||
if version_info[:2] < (3, 10):
|
||||
kwargs['loop'] = loop
|
||||
yield from cls(asyncio.as_completed(fs, timeout=timeout, **kwargs),
|
||||
total=total, **tqdm_kwargs)
|
||||
|
||||
@classmethod
|
||||
async def gather(cls, *fs, loop=None, timeout=None, total=None, **tqdm_kwargs):
|
||||
"""
|
||||
Wrapper for `asyncio.gather`.
|
||||
"""
|
||||
async def wrap_awaitable(i, f):
|
||||
return i, await f
|
||||
|
||||
ifs = [wrap_awaitable(i, f) for i, f in enumerate(fs)]
|
||||
res = [await f for f in cls.as_completed(ifs, loop=loop, timeout=timeout,
|
||||
total=total, **tqdm_kwargs)]
|
||||
return [i for _, i in sorted(res)]
|
||||
|
||||
|
||||
def tarange(*args, **kwargs):
|
||||
"""
|
||||
A shortcut for `tqdm.asyncio.tqdm(range(*args), **kwargs)`.
|
||||
"""
|
||||
return tqdm_asyncio(range(*args), **kwargs)
|
||||
|
||||
|
||||
# Aliases
|
||||
tqdm = tqdm_asyncio
|
||||
trange = tarange
|
Loading…
Add table
Add a link
Reference in a new issue