Skip to content

Commit 24d46b4

Browse files
committed
add DynamicState to FAQ (#146)
1 parent e66d02e commit 24d46b4

File tree

1 file changed

+55
-1
lines changed

1 file changed

+55
-1
lines changed

Diff for: examples/Frequently asked questions.ipynb

+55-1
Original file line numberDiff line numberDiff line change
@@ -301,11 +301,65 @@
301301
{
302302
"cell_type": "markdown",
303303
"metadata": {},
304+
"source": [
305+
"You lose `model.is_<state>` convenience functions and the ability to add callbacks such as `Model.on_enter_<state>` automatically. However, the second limitation can be tackled with dynamic resolution in states as pointed out by [mvanderlee](https://github.com/mvanderlee) [here](https://github.com/pytransitions/transitions/issues/146#issuecomment-869049925):"
306+
]
307+
},
308+
{
309+
"cell_type": "code",
310+
"execution_count": null,
311+
"outputs": [],
312+
"source": [
313+
"from transitions import State\n",
314+
"import logging\n",
315+
"\n",
316+
"logger = logging.getLogger(__name__)\n",
317+
"\n",
318+
"\n",
319+
"class DynamicState(State):\n",
320+
" \"\"\" Need to dynamically get the on_enter and on_exit callbacks since the\n",
321+
" model can not be registered to the Machine due to Memory limitations\n",
322+
" \"\"\"\n",
323+
"\n",
324+
" def enter(self, event_data):\n",
325+
" \"\"\" Triggered when a state is entered. \"\"\"\n",
326+
" logger.debug(\"%sEntering state %s. Processing callbacks...\", event_data.machine.name, self.name)\n",
327+
" if hasattr(event_data.model, f'on_enter_{self.name}'):\n",
328+
" event_data.machine.callbacks([getattr(event_data.model, f'on_enter_{self.name}')], event_data)\n",
329+
" logger.info(\"%sFinished processing state %s enter callbacks.\", event_data.machine.name, self.name)\n",
330+
"\n",
331+
" def exit(self, event_data):\n",
332+
" \"\"\" Triggered when a state is exited. \"\"\"\n",
333+
" logger.debug(\"%sExiting state %s. Processing callbacks...\", event_data.machine.name, self.name)\n",
334+
" if hasattr(event_data.model, f'on_exit_{self.name}'):\n",
335+
" event_data.machine.callbacks([getattr(event_data.model, f'on_exit_{self.name}')], event_data)\n",
336+
" logger.info(\"%sFinished processing state %s exit callbacks.\", event_data.machine.name, self.name)\n",
337+
"\n",
338+
"\n",
339+
"class DynamicMachine(Machine):\n",
340+
" \"\"\"Required to use DynamicState\"\"\"\n",
341+
" state_cls = DynamicState"
342+
],
343+
"metadata": {
344+
"collapsed": false,
345+
"pycharm": {
346+
"name": "#%%\n"
347+
}
348+
}
349+
},
350+
{
351+
"cell_type": "markdown",
304352
"source": [
305353
"### Is there a 'during' callback which is called when no transition has been successful?\n",
306354
"\n",
307355
"Currently, `transitions` has no such callback. This example from the issue discussed [here](https://github.com/pytransitions/transitions/issues/342) might give you a basic idea about how to extend `Machine` with such a feature:"
308-
]
356+
],
357+
"metadata": {
358+
"collapsed": false,
359+
"pycharm": {
360+
"name": "#%% md\n"
361+
}
362+
}
309363
},
310364
{
311365
"cell_type": "code",

0 commit comments

Comments
 (0)