What is the best way to keep local state in a node in Bonobo-etl?
up vote
0
down vote
favorite
If I have an input queue with 20 numbers, how can I get e.g. the sum of all numbers? So far this is what I came up with:
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()
)
It is ok to do it like this or is there a better way?
python-3.x bonobo-etl
add a comment |
up vote
0
down vote
favorite
If I have an input queue with 20 numbers, how can I get e.g. the sum of all numbers? So far this is what I came up with:
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()
)
It is ok to do it like this or is there a better way?
python-3.x bonobo-etl
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
If I have an input queue with 20 numbers, how can I get e.g. the sum of all numbers? So far this is what I came up with:
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()
)
It is ok to do it like this or is there a better way?
python-3.x bonobo-etl
If I have an input queue with 20 numbers, how can I get e.g. the sum of all numbers? So far this is what I came up with:
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()
)
It is ok to do it like this or is there a better way?
python-3.x bonobo-etl
python-3.x bonobo-etl
asked Nov 8 at 17:53
user681814
5431517
5431517
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
up vote
1
down vote
accepted
There are different available options to keep local state in a Bonobo ETL node.
It's ok to do it like you did (although I think it's hard to read), I tend to prefer to use closures which I think are more readable (but I agree, that's debatable):
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))
A few examples are available in the bonobo source code, please look in https://github.com/python-bonobo/bonobo/blob/develop/bonobo/nodes/basics.py (and there are examples written in different styles).
Note that I'm using the Bonobo 0.7 (incoming) syntax here to build the graph, but the same thing can be used with current stable version (0.6) by replacing ">>" operators by add_chain calls.
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
accepted
There are different available options to keep local state in a Bonobo ETL node.
It's ok to do it like you did (although I think it's hard to read), I tend to prefer to use closures which I think are more readable (but I agree, that's debatable):
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))
A few examples are available in the bonobo source code, please look in https://github.com/python-bonobo/bonobo/blob/develop/bonobo/nodes/basics.py (and there are examples written in different styles).
Note that I'm using the Bonobo 0.7 (incoming) syntax here to build the graph, but the same thing can be used with current stable version (0.6) by replacing ">>" operators by add_chain calls.
add a comment |
up vote
1
down vote
accepted
There are different available options to keep local state in a Bonobo ETL node.
It's ok to do it like you did (although I think it's hard to read), I tend to prefer to use closures which I think are more readable (but I agree, that's debatable):
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))
A few examples are available in the bonobo source code, please look in https://github.com/python-bonobo/bonobo/blob/develop/bonobo/nodes/basics.py (and there are examples written in different styles).
Note that I'm using the Bonobo 0.7 (incoming) syntax here to build the graph, but the same thing can be used with current stable version (0.6) by replacing ">>" operators by add_chain calls.
add a comment |
up vote
1
down vote
accepted
up vote
1
down vote
accepted
There are different available options to keep local state in a Bonobo ETL node.
It's ok to do it like you did (although I think it's hard to read), I tend to prefer to use closures which I think are more readable (but I agree, that's debatable):
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))
A few examples are available in the bonobo source code, please look in https://github.com/python-bonobo/bonobo/blob/develop/bonobo/nodes/basics.py (and there are examples written in different styles).
Note that I'm using the Bonobo 0.7 (incoming) syntax here to build the graph, but the same thing can be used with current stable version (0.6) by replacing ">>" operators by add_chain calls.
There are different available options to keep local state in a Bonobo ETL node.
It's ok to do it like you did (although I think it's hard to read), I tend to prefer to use closures which I think are more readable (but I agree, that's debatable):
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))
A few examples are available in the bonobo source code, please look in https://github.com/python-bonobo/bonobo/blob/develop/bonobo/nodes/basics.py (and there are examples written in different styles).
Note that I'm using the Bonobo 0.7 (incoming) syntax here to build the graph, but the same thing can be used with current stable version (0.6) by replacing ">>" operators by add_chain calls.
answered Nov 9 at 6:37
Romain
328212
328212
add a comment |
add a comment |
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53213497%2fwhat-is-the-best-way-to-keep-local-state-in-a-node-in-bonobo-etl%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown