Как отправить именованные кортежи между преобразованиями? - PullRequest
0 голосов
/ 25 декабря 2018

Как отправить строку в виде namedtle из одного преобразования Бонобо?Таким образом, в получающем преобразовании у меня есть доступ на уровне поля к данным строки.

Сейчас я использую dicts для отправки данных между преобразованиями.Но у них есть недостаток: они изменчивы (плохие вещи могут случиться, если вы забудете создать новый при выводе преобразования).

Я думал, что простая замена dict с именованным кортежем поможет.но, очевидно, Бонобо не поддерживает отправку именованного кортежа.Я прочитал кое-что о context.set_output_fields [список ключей]), но не могу понять, как его использовать.Небольшой пример был бы великолепен!

1 Ответ

0 голосов
/ 06 июня 2019

Использование namedtuple очень просто, вы можете получить экземпляр namedtuple и получить его развернутым в качестве следующего входного преобразования:

import bonobo
import collections

Hero = collections.namedtuple("Hero", ["name", "power"])


def produce():
    yield Hero(name="Road Runner", power="speed")
    yield Hero(name="Wile E. Coyote", power="traps")
    yield Hero(name="Guido", power="dutch")


def consume(name, power):
    print(name, "has", power, "power")


def get_graph():
    graph = bonobo.Graph()
    graph >> produce >> consume
    return graph


if __name__ == "__main__":
    with bonobo.parse_args() as options:
        bonobo.run(get_graph())

"Поля вывода" produce() будут установлены из полей namedtupleи «поля ввода» consume(...) будут обнаружены из первой строки ввода.

Метод context.set_output_fields(...) полезен, только если по какой-либо причине вы не хотите использовать именованные структуры данных (например, namedtuples) но предпочитаю использовать кортежи, но при этом необходимо указывать имена в кортеже.

Надеюсь, это поможет!

...