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.
