Каков наилучший способ сохранить локальное состояние в узле в Bonobo-etl? - PullRequest
0 голосов
/ 08 ноября 2018

Если у меня есть входная очередь с 20 числами, как я могу получить, например, сумму всех чисел?Пока что это то, что я придумал:

import bonobo as bb
from bonobo.config import Configurable, ContextProcessor
from bonobo.util import ValueHolder

def extract_nums():
    yield 1
    yield 2
    yield 3

class TransformNumber(Configurable):
    @ContextProcessor
    def total(self, context):
        yield ValueHolder({'extract':0,'transform':0})

    def __call__(self, total, num, **kwargs):
        total['extract']+=num
        transform_num = num * 10
        total['transform']+=transform_num
        if num==3: # Final number
            print("TOTALS:",total.get())
        yield transform_num

graph = bb.Graph()
graph.add_chain(
    extract_nums,
    TransformNumber(),
    bb.PrettyPrinter()
)

Это нормально делать так или есть лучший способ?

1 Ответ

0 голосов
/ 09 ноября 2018

Существуют различные доступные варианты сохранения локального состояния в узле Bonobo ETL.

Это нормально, чтобы сделать это, как вы сделали (хотя я думаю, что это трудно читать), я, как правило, предпочитают использовать затворы, которые я думаю, более читаемым (но я согласен, что спорно):

import bonobo


def CumSum():
    total = 0

    def cum_sum(x):
        nonlocal total
        total += x
        yield x, total

    return cum_sum


def get_graph(**options):
    graph = bonobo.Graph()
    graph.get_cursor() >> range(100) >> CumSum() >> print

    return graph


# The __main__ block actually execute the graph.
if __name__ == "__main__":
    parser = bonobo.get_argument_parser()
    with bonobo.parse_args(parser) as options:
        bonobo.run(get_graph(**options))

В исходном коде бонобо доступно несколько примеров, пожалуйста, посмотрите в https://github.com/python-bonobo/bonobo/blob/develop/bonobo/nodes/basics.py (и есть примеры, написанные в разных стилях).

Обратите внимание, что здесь я использую синтаксис Bonobo 0.7 (входящий) для построения графика, но то же самое можно использовать с текущей стабильной версией (0.6), заменив операторы >> на вызовы add_chain.

...