> On Dec. 5, 2014, 10:24 p.m., Rafael Schloming wrote: > > proton-c/bindings/python/proton/__init__.py, line 3542 > > <https://reviews.apache.org/r/28770/diff/1/?file=784021#file784021line3542> > > > > To expand on my question here, I'd also like to understand if this > > __getattr__ is just an expedient way of copying a specific set of > > attributes from the context into the event or if it is actually your intent > > to flatten any arbitrary context properties into the event object. > > Gordon Sim wrote: > What I want is a 'uniform' interface to an event. I.e. rather than the > event-type dependent context being the only thing directly exposed, I'd like > the connection property to be available for any event that is in any way > associated with a connection (even if it is say a delivery- or link- event), > likewise for sessions and links. So whether I'm handing an incoming message, > a change in credit, or perhaps even a change in endpoint state, I can get the > relevant objects via the same property rather than having deducing the > context type and figure out how to get what I want from that. > > I'd like to be able to keep this same interface even for 'extended' > events created outside the core engine - e.g. perhaps a timer for retrying a > disconnected connection, or an application defined event indicating > availability of data to send on a given link. The extended events however may > additionally have some other properties. > > So getting back to the question now the high level goal is (hopefully!) > explained, the context seems to me like an internal detail. What I care about > as a user is getting the connection or link or session or foo from the event. > The context is just the mechanism that makes this work via swig etc. As a > user I don't want to distinguish between context and the event itself. > > Rafael Schloming wrote: > If you don't want to distinguish between the context and the event, then > why pass the event around in the first place? I believe in an earlier > incarnation of the examples I had the dispatch mechanism set up to pass the > context directly into the handler rather than passing in the event. I believe > at the time you said you preferred passing around the event because it is > more flexible, e.g. we can pass in extra info without changing the signature > of the handler. This same argument would suggest to me that you do actually > do want to distinguish between the context and the event itsef. > > To be clear I'm not against having convenience accessors as you describe, > however I don't think it's a good idea for the getattr to actually exposing > *everything* in the context onto the event. It makes it unclear to me whether > "Event" is actually exposed as a first class thing for users or not. If it's > not then I think it's better to eliminate it during the dispatch process and > just pass around the context. If it is then I think it's better to explicitly > define exactly what properties an event has for every given event type. > > As you have it, the current shadowing behavior can lead to confusing > situations, e.g. I'm guessing you can probably write code that pretends the > event actually *is* the connection, e.g. do things like event.open(), > event.close(), etc, but stuff like event.hostname = "blah"; event.open() > would fail silently since the hostname attribute would get set on the event, > but the open method would get called from the connection. (Note I haven't > actually tried the previous example, so please correct me if I'm mistaken.) > > Gordon Sim wrote: > Clearly the event is different from the connection it occurred on, so my > choice of phrasing there was poor. > > What I'm trying to explain is the difference between having to understand > what the context is for different events, versus just having some common > properties of an event that are used whenever that property is relevant. E.g. > event.connection vs. event.context, or event.context.connection or > event.context.session.connection. I like thinking of the associated > connection as simply a property of the event, one that is always there for > connection-relevant events. > > I'm certainly open to better ways of accomplishing the same thing. The > uniformity is the most important aspect to me.
Updated patch no longer uses the __getattr__, but instead allows different types of event to be returned from the collector. - Gordon ----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: https://reviews.apache.org/r/28770/#review64096 ----------------------------------------------------------- On Dec. 9, 2014, 11:56 a.m., Gordon Sim wrote: > > ----------------------------------------------------------- > This is an automatically generated e-mail. To reply, visit: > https://reviews.apache.org/r/28770/ > ----------------------------------------------------------- > > (Updated Dec. 9, 2014, 11:56 a.m.) > > > Review request for qpid and Rafael Schloming. > > > Repository: qpid-proton-git > > > Description > ------- > > These are the current reactive examples using the engine API, that I have > been evolving on the examples branch, alog with the utility code they depend > on. I still need to evolve/rationalise the examples themselves as well as the > utility code, but I believe it would be beneficial to all to do this from the > master branch. > > > Diffs > ----- > > examples/engine/py/README PRE-CREATION > examples/engine/py/abstract_server.py PRE-CREATION > examples/engine/py/client.py PRE-CREATION > examples/engine/py/client_http.py PRE-CREATION > examples/engine/py/common.py PRE-CREATION > examples/engine/py/db_common.py PRE-CREATION > examples/engine/py/db_ctrl.py PRE-CREATION > examples/engine/py/db_recv.py PRE-CREATION > examples/engine/py/db_send.py PRE-CREATION > examples/engine/py/helloworld.py PRE-CREATION > examples/engine/py/helloworld_blocking.py PRE-CREATION > examples/engine/py/helloworld_direct.py PRE-CREATION > examples/engine/py/helloworld_direct_tornado.py PRE-CREATION > examples/engine/py/helloworld_tornado.py PRE-CREATION > examples/engine/py/proton_server.py PRE-CREATION > examples/engine/py/proton_tornado.py PRE-CREATION > examples/engine/py/recurring_timer.py PRE-CREATION > examples/engine/py/recurring_timer_tornado.py PRE-CREATION > examples/engine/py/selected_recv.py PRE-CREATION > examples/engine/py/server.py PRE-CREATION > examples/engine/py/server_tx.py PRE-CREATION > examples/engine/py/simple_recv.py PRE-CREATION > examples/engine/py/simple_send.py PRE-CREATION > examples/engine/py/sync_client.py PRE-CREATION > examples/engine/py/tx_recv.py PRE-CREATION > examples/engine/py/tx_recv_interactive.py PRE-CREATION > examples/engine/py/tx_send.py PRE-CREATION > examples/engine/py/tx_send_sync.py PRE-CREATION > proton-c/bindings/python/CMakeLists.txt > 6be421e237f86f2aa99c23ffbc08af821b5c8438 > proton-c/bindings/python/proton/__init__.py > fce3255bfce440dcae57457d259147a4ced8216e > proton-c/bindings/python/proton/handlers.py PRE-CREATION > proton-c/bindings/python/proton/reactors.py PRE-CREATION > proton-c/bindings/python/proton/utils.py PRE-CREATION > > Diff: https://reviews.apache.org/r/28770/diff/ > > > Testing > ------- > > All examples have been tested, note that the transactional examples require a > couple of extra proton-c patches (available on respective JIRAs) in order to > run correctly. > > > Thanks, > > Gordon Sim > >