Самый простой способ добиться того, что вы описываете, - это использовать контекстный процессор.
import bonobo
def xml_document(self, context):
context.send('<document>')
yield
context.send('</document>')
@bonobo.config.use_context_processor(xml_document)
def make_me_an_xml(id, name):
yield ' <id>{id}</id><name>{name}</name>'.format(id=id, name=name)
def get_graph(**options):
graph = bonobo.Graph(
[{
'id': 1,
'name': 'Jane'
}, {
'id': 2,
'name': 'John'
}], bonobo.UnpackItems(0), bonobo.OrderFields(['id', 'name']), make_me_an_xml, print
)
return graph
if __name__ == '__main__':
with bonobo.parse_args() as options:
bonobo.run(get_graph(**options))
Причина, по которой вы не можете сделать это непосредственно в своей функции, состоит в том, что узлы в бонобо работают слогика вызова на входную строку и не имеет представления (по умолчанию) обо всем контексте выполнения.
Это позволяет сохранять функции преобразования без сохранения состояния.Но вы действительно можете украсить его логикой работы, которую понимает bonobo.
Обратите внимание, что этот API, вероятно, будет развиваться в будущем, поскольку он не вполне удовлетворителен.
Если вам действительно нужно использоватьВ контексте преобразования уровня строки вы также можете украсить преобразование с помощью декоратора @bonobo.config.use_context
.
Надеюсь, это поможет.