|
301 | 301 | {
|
302 | 302 | "cell_type": "markdown",
|
303 | 303 | "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", |
304 | 352 | "source": [
|
305 | 353 | "### Is there a 'during' callback which is called when no transition has been successful?\n",
|
306 | 354 | "\n",
|
307 | 355 | "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 | + } |
309 | 363 | },
|
310 | 364 | {
|
311 | 365 | "cell_type": "code",
|
|
0 commit comments