iterable can be any Iterable, not just a Sequence

need to give N_iter only in cases when iterable is not a Sequence
This commit is contained in:
Martin Diehl 2022-01-22 07:50:52 +01:00
parent 7e9ce682e7
commit a35a01d41b
2 changed files with 21 additions and 10 deletions

View File

@ -79,7 +79,7 @@ def from_Poisson_disc(size: _FloatSequence, N_seeds: int, N_candidates: int, dis
s = 1 s = 1
i = 0 i = 0
progress = _util._ProgressBar(N_seeds+1,'',50) progress = _util.ProgressBar(N_seeds+1,'',50)
while s < N_seeds: while s < N_seeds:
i += 1 i += 1
candidates = rng.random((N_candidates,3))*_np.broadcast_to(size,(N_candidates,3)) candidates = rng.random((N_candidates,3))*_np.broadcast_to(size,(N_candidates,3))

View File

@ -7,8 +7,9 @@ import subprocess
import shlex import shlex
import re import re
import fractions import fractions
import collections.abc as abc
from functools import reduce from functools import reduce
from typing import Union, Tuple, Sequence, Callable, Dict, List, Any, Literal, Optional from typing import Union, Tuple, Iterable, Sequence, Callable, Dict, List, Any, Literal, Optional
from pathlib import Path from pathlib import Path
import numpy as np import numpy as np
@ -203,7 +204,7 @@ def natural_sort(key: str) -> List[Union[int, str]]:
return [ convert(c) for c in re.split('([0-9]+)', key) ] return [ convert(c) for c in re.split('([0-9]+)', key) ]
def show_progress(iterable: Sequence[Any], def show_progress(iterable: Iterable,
N_iter: int = None, N_iter: int = None,
prefix: str = '', prefix: str = '',
bar_length: int = 50) -> Any: bar_length: int = 50) -> Any:
@ -214,22 +215,32 @@ def show_progress(iterable: Sequence[Any],
Parameters Parameters
---------- ----------
iterable : iterable or function with yield statement iterable : iterable
Iterable (or function with yield statement) to be decorated. Iterable to be decorated.
N_iter : int, optional N_iter : int, optional
Total number of iterations. Required unless obtainable as len(iterable). Total number of iterations. Required if iterable is not a sequence.
prefix : str, optional prefix : str, optional
Prefix string. Prefix string.
bar_length : int, optional bar_length : int, optional
Length of progress bar in characters. Defaults to 50. Length of progress bar in characters. Defaults to 50.
""" """
if N_iter in [0,1] or (hasattr(iterable,'__len__') and len(iterable) <= 1): if isinstance(iterable,abc.Sequence):
if N_iter is None:
N = len(iterable)
else:
raise ValueError('N_iter given for sequence')
else:
if N_iter is None:
raise ValueError('N_iter not given')
else:
N = N_iter
if N <= 1:
for item in iterable: for item in iterable:
yield item yield item
else: else:
status = _ProgressBar(N_iter if N_iter is not None else len(iterable),prefix,bar_length) status = ProgressBar(N,prefix,bar_length)
for i,item in enumerate(iterable): for i,item in enumerate(iterable):
yield item yield item
status.update(i) status.update(i)
@ -692,7 +703,7 @@ def dict_flatten(d: Dict) -> Dict:
#################################################################################################### ####################################################################################################
# Classes # Classes
#################################################################################################### ####################################################################################################
class _ProgressBar: class ProgressBar:
""" """
Report progress of an interation as a status bar. Report progress of an interation as a status bar.