Spaces:
Runtime error
Runtime error
from typing import Iterator | |
from .base import BaseAction, ActionStop | |
from ..model import ImageItem | |
class FirstNSelectAction(BaseAction): | |
def __init__(self, n: int): | |
self._n = n | |
self._passed = 0 | |
def iter(self, item: ImageItem) -> Iterator[ImageItem]: | |
if self._passed < self._n: | |
yield item | |
self._passed += 1 | |
else: | |
raise ActionStop | |
def reset(self): | |
self._passed = 0 | |
def _slice_process(start, stop, step): | |
start = 0 if start is None else start | |
step = 1 if step is None else step | |
if not isinstance(start, int) or start < 0: | |
raise ValueError(f'Start should be an integer no less than 0, but {start!r} found.') | |
if stop is not None and (not isinstance(stop, int) or stop < 0): | |
raise ValueError(f'Stop should be an integer no less than 0, but {stop!r} found.') | |
if not isinstance(step, int) or step < 1: | |
raise ValueError(f'Step should be an integer no less than 1, but {step!r} found.') | |
return start, stop, step | |
class SliceSelectAction(BaseAction): | |
def __init__(self, *args): | |
if len(args) == 0: | |
slice_args = _slice_process(None, None, None) | |
elif len(args) == 1: | |
slice_args = _slice_process(None, args[0], None) | |
elif len(args) == 2: | |
slice_args = _slice_process(args[0], args[1], None) | |
elif len(args) == 3: | |
slice_args = _slice_process(args[0], args[1], args[2]) | |
else: | |
raise ValueError(f'Arguments of {self.__class__.__name__} should no no more than 3, but {args!r} found.') | |
self._start, self._stop, self._step = slice_args | |
if self._stop is not None: | |
self._max = self._start + ((self._stop - self._start - 1) // self._step) * self._step | |
else: | |
self._max = None | |
self._current = 0 | |
def _check_current(self): | |
if self._stop is not None and self._current >= self._stop: | |
return False | |
if self._current < self._start: | |
return False | |
return (self._current - self._start) % self._step == 0 | |
def iter(self, item: ImageItem) -> Iterator[ImageItem]: | |
if self._current > self._max: | |
raise ActionStop | |
else: | |
if self._check_current(): | |
yield item | |
self._current += 1 | |
def reset(self): | |
self._current = 0 | |