Datatoy Logo

Décorateurs

Marquer sources, tâches et routages

@source, source_from(...) et @splitter (importables depuis olympipe) enregistrent l'objet marqué dans le registre olympipe.registry sous son nom, puis le renvoient inchangé. C'est leur seul effet : Pipeline ne lit pas ce registre, donc l'exécution est identique avec ou sans décorateur.

Signature

@source                              # generator function
source_from(iterable, name=None)     # returns the iterable unchanged
@splitter                            # routing function for .split()
# also available: @task, @filter (checks the -> bool annotation),
# @class_task(method, close=None, name=None)
python
from typing import Optional, Tuple
from olympipe import Pipeline, source, source_from, splitter

@source
def numbers():
    yield from range(6)

letters = source_from(["a", "b"], name="letters")   # renvoie la liste inchangée

@splitter
def parity(x: int) -> Tuple[Optional[int], Optional[int]]:
    return (x, None) if x % 2 == 0 else (None, x)

# Les objets décorés s'utilisent exactement comme avant
evens, odds = Pipeline(numbers()).split(parity)
print(evens.wait_for_results([odds]))
print(Pipeline(letters).task(str.upper).wait_for_result())
Sortie
[[0, 2, 4], [1, 3, 5]]
['A', 'B']

Comment ça fonctionne

source_from(iterable, name=None) enregistre un itérable (liste, range, générateur) sous name ou, à défaut, sous son __name__. Ce qui permet à .split(fn) de se passer de n n'est pas @splitter mais l'annotation de retour Tuple[...] de la fonction. @filter vérifie en plus que l'annotation de retour est bool.