I am trying to pass a parameter to conditions. But it was giving the following error
code:
from transitions import Machine
class evenodd(object):
def get_no(self, event):
self.no = event.kwargs.get('no', 0)
def calc_mod(self, event):
self.mod = event.kwargs.get('mod', self.no%2)
def is_even(self, event):
if self.mod == 0:
return True
obj = evenodd()
machine = Machine(obj, ['init', 'getno', 'even', 'odd'], send_event=True, initial='init', ignore_invalid_triggers=True, auto_transitions=False)
machine.add_transition('enterno', 'init', 'getno', before='get_no')
machine.add_transition('isevenodd', 'getno', 'even', before='calc_mod', conditions=['is_even'])
machine.add_transition('isevenodd', 'getno', 'odd', before='calc_mod', conditions=['is_odd'])
s_state = obj.state
print("state --> "+s_state)
trigger = machine.get_triggers(s_state)[0]
print("transition --> "+trigger)
obj.enterno(2)
s_state = obj.state
print("state --> "+s_state)
trigger = machine.get_triggers(s_state)[0]
print("transition --> "+trigger)
obj.isevenodd()
s_state = obj.state
print("state --> "+s_state)
Error:
state --> init
transition --> enterno
state --> getno
transition --> isevenodd
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-75-d8ede3775dc5> in <module>
8 trigger = machine.get_triggers(s_state)[0]
9 print("transition --> "+trigger)
---> 10 obj.isevenodd()
11 s_state = obj.state
12 print("state --> "+s_state)
~\Anaconda3\envs\ml_nlp_cpu\lib\site-packages\transitions\core.py in trigger(self, model, *args, **kwargs)
388 # Machine._process should not be called somewhere else. That's why it should not be exposed
389 # to Machine users.
--> 390 return self.machine._process(func)
391
392 def _trigger(self, model, *args, **kwargs):
~\Anaconda3\envs\ml_nlp_cpu\lib\site-packages\transitions\core.py in _process(self, trigger)
1112 if not self._transition_queue:
1113 # if trigger raises an Error, it has to be handled by the Machine.process caller
-> 1114 return trigger()
1115 else:
1116 raise MachineError("Attempt to process events synchronously while transition queue is not empty!")
~\Anaconda3\envs\ml_nlp_cpu\lib\site-packages\transitions\core.py in _trigger(self, model, *args, **kwargs)
406 raise MachineError(msg)
407 event_data = EventData(state, self, self.machine, model, args=args, kwargs=kwargs)
--> 408 return self._process(event_data)
409
410 def _process(self, event_data):
~\Anaconda3\envs\ml_nlp_cpu\lib\site-packages\transitions\core.py in _process(self, event_data)
415 for trans in self.transitions[event_data.state.name]:
416 event_data.transition = trans
--> 417 if trans.execute(event_data):
418 event_data.result = True
419 break
~\Anaconda3\envs\ml_nlp_cpu\lib\site-packages\transitions\core.py in execute(self, event_data)
260 _LOGGER.debug("%sExecuted callbacks before conditions.", event_data.machine.name)
261
--> 262 if not self._eval_conditions(event_data):
263 return False
264
~\Anaconda3\envs\ml_nlp_cpu\lib\site-packages\transitions\core.py in _eval_conditions(self, event_data)
241 def _eval_conditions(self, event_data):
242 for cond in self.conditions:
--> 243 if not cond.check(event_data):
244 _LOGGER.debug("%sTransition condition failed: %s() does not return %s. Transition halted.",
245 event_data.machine.name, cond.func, cond.target)
~\Anaconda3\envs\ml_nlp_cpu\lib\site-packages\transitions\core.py in check(self, event_data)
179 predicate = event_data.machine.resolve_callable(self.func, event_data)
180 if event_data.machine.send_event:
--> 181 return predicate(event_data) == self.target
182 return predicate(*event_data.args, **event_data.kwargs) == self.target
183
<ipython-input-74-5dc86072aabd> in is_even(self, event)
7 def is_even(self, event):
8 """ Basically a coin toss. """
----> 9 if self.mod == 0:
10 return True
11
AttributeError: 'evenodd' object has no attribute 'mod'
How to share the variables no, and mod with each of these callbacks. I tried to use the event. In this simple example, I tried to create a state machine to reach the state based on whether the given input is even or odd.