On 15/03/2021 09:34, Glyph wrote:
Right, but as best I can tell, outputs in automat have to be defined as part of the state machine class, I need targets only available after class instantiation to be notified.
Outputs are just methods, so it sort of depends what you mean by "after class instantiation". You can call whatever you want /in/ an output.
Right, but then I'd have to maintain my own list of subscribers and figure out a way to duplicate in that logic in each of the output methods defined on the machine.
Again... have outputs. I think there's something you're leaving out about how you want to have some /generalized/ output, but without knowing a bit more it's hard to say how it could help more :).
I think it's what I said above. TBH, I'm probably going to end up writing "yet another state machine class" that does just what I need, but I think that's okay - not everything has to work for every situation :-)
It sounds like what you /might/ want here is soemthing for constructing arbitrary machines at runtime,
The states and transitions are very rigid.
and automat is all about enforcing that your machine is static so that (for example) it can be visualized statically. So yeah in that case, different library.
Take this example: class LightSwitch(object): _machine = MethodicalMachine() @_machine.state(serialized="on") def on_state(self): "the switch is on" @_machine.state(serialized="off", initial=True) def off_state(self): "the switch is off" @_machine.input() def flip(self): "flip the switch" on_state.upon(flip, enter=off_state, outputs=[]) off_state.upon(flip, enter=on_state, outputs=[]) What I'm looking to do is something along the lines of: aSwitch = LightSwitch() aSwitch.flip.addListener(myCallable) myCallable might well be a deferred that something else is waiting on... Chris