{ "info": { "author": "v1ll4n", "author_email": "v1ll4n@villanch.top", "bugtrack_url": null, "classifiers": [], "description": "# scouter\n\u5b9a\u4e49\u4e00\u7fa4\u7c7b\u4f3c Python \u5185\u7f6e\u6570\u636e\u7ed3\u6784\u7684\u4e00\u7fa4\u6570\u636e\u7ed3\u6784\uff0c\u6570\u636e\u7ed3\u6784\u53d1\u751f\u53d8\u5316\u7684\u65f6\u5019\uff0c\u53d1\u751f\u56de\u8c03\u3002\n\n\u540c\u65f6 scouter \u8fd8\u5305\u542b\u4e86\u4e00\u4e2a\u6613\u4e8e\u914d\u7f6e\u7684\u88c5\u9970\u5668\u6a21\u5f0f\u7684 FSM\uff0c\u53ef\u4ee5\u652f\u6301 SOP \u4e0e OOP \u7684\u7ed3\u5408\u3002\n\n## \u5b89\u88c5\u65b9\u6cd5\uff1a\n\n```bash\npip install scouter\n```\n\n\u6216\u8005 `easy_install`\n\n\u6216\u8005\u4e0b\u8f7d\u6e90\u4ee3\u7801:\n\n```bash\ncd scouter\npython setup.py install\n```\n\n## \u4f7f\u7528\u65b9\u6cd5\uff1a\n\n### SVar \u4f7f\u7528\u56de\u8c03\u51fd\u6570\u76d1\u89c6\u53d8\u91cf\n\n```python\n\nfrom scouter import SVar\n\ndef callback(now, orig):\n print 'Orig:{} Now:{}'.format(orig, now)\n\nvar = SVar(4, callback)\nvar.value = 5\n```\n\n\u5bf9\u4e8e\u4e00\u4e2a SVar \u5bf9\u8c61\uff0c\u5728\u5b9a\u4e49\u7684\u65f6\u5019\uff0c\u53ef\u4ee5\u6dfb\u52a0\u4e00\u4e2a\u56de\u8c03\u51fd\u6570\uff0c\u8fd9\u4e2a\u56de\u8c03\u51fd\u6570\u53ea\u63a5\u53d7\u4e24\u4e2a\u53c2\u6570\uff1a \n\n* \u7b2c\u4e00\u4e2a\u53c2\u6570\u4e3a\u5f53\u524d\u65b0\u7684\u503c\n* \u7b2c\u4e8c\u4e2a\u53c2\u6570\u4e3a\u539f\u6765\u7684\u503c\n\n### SList \u4f7f\u7528\u56de\u8c03\u51fd\u6570\u76d1\u89c6\u5217\u8868\u7ed3\u6784\n\n```python\n\nfrom scouter import SList\n\ndef print_cb(obj, index):\n print obj, index\n\ndef print_new(_new, orig):\n print 'new:{} orig:{}'.format(_new, orig)\n\n_list = SList(value=['aaaaaaaa',2,3,4,5],\n add_new_item_callback=print_cb,\n del_new_item_callback=print_cb,\n new_list_value_callback=print_new)\n\n_list.append('asdf')\n_list.pop(0)\n\nfor i in _list:\n print i\n\nassert 4 == _list[2]\n\ndel _list[2]\n\n_list.value = [1,2,3,4,5,]\n```\n\n\u5bf9\u4e8e\u4e00\u4e2a SList \u5bf9\u8c61\uff0c\u5728\u5b9a\u4e49\u7684\u65f6\u5019\uff0c\u53ef\u4ee5\u6dfb\u52a0\u4e09\u4e2a\u56de\u8c03\u51fd\u6570\uff0c\u8fd9\u4e09\u4e2a\u56de\u8c03\u51fd\u6570\u7684\u53c2\u6570\u90fd\u6709\u4e24\u4e2a\u53c2\u6570\uff1a\n\n* \u5bf9\u4e8e add_new_item_callback \u6765\u8bf4\uff0c\u7b2c\u4e00\u4e2a\u53c2\u6570\u662f\u6dfb\u52a0\u7684\u65b0\u503c\uff0c\u7b2c\u4e8c\u4e2a\u53c2\u6570\u662f\u7d22\u5f15\n* \u5bf9\u4e8e del_new_item_callback \u6765\u8bf4\uff0c\u7b2c\u4e00\u4e2a\u53c2\u6570\u662f\u88ab\u5220\u9664\u7684\u503c\uff0c\u7b2c\u4e8c\u4e2a\u53c2\u6570\u662f\u7d22\u5f15\n* \u5bf9\u4e8e new_list_value_callback \u6765\u8bf4\uff0c\u7b2c\u4e00\u4e2a\u53c2\u6570\u662f\u73b0\u5728\u7684\u65b0\u503c\uff0c\u7b2c\u4e8c\u4e2a\u53c2\u6570\u662f\u4e4b\u524d\u7684 value\n\n```python\n\nfrom scouter import SDict\n\ndef print_kv(key, value):\n print 'key:{} value:{}'.format(key, value)\n\ndef print_new(new, orig):\n print 'new:{}, orig:{}'.format(new, orig)\n\n_dict = SDict({1:2,'key':'value'},\n new_kv_callback=print_kv,\n del_kv_callback=print_kv,\n new_value_callback=print_new)\n\n_dict['key'] = 'hhhhhhhhhvalue1'\n_dict['key1'] = 'hhhhhhhhhvalue12'\ndel _dict[1]\n\n\n_dict.value = {5:4}\n```\n\n\u57fa\u672c\u540c\u4e0a\uff0c\u53ea\u662f\u5bf9\u4e8e new_kv_callback/del_kv_callback \u6765\u8bf4\u4e24\u4e2a\u53c2\u6570\u5206\u522b\u4e3a key \u548c value\u3002\n\n### SOP FSM\n\n\u66f4\u52a0\u5bb9\u6613\u5b9a\u4e49\u66f4\u52a0\u5bb9\u6613\u4f7f\u7528\u7684 FSM\u3002\n\n```python\n\u4e0b\u9762\u662f\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u7684\u4f8b\u5b50\n\ndef test_fsm(self):\n \"\"\"\"\"\"\n state_START = 'start'\n state_RUNNING = 'running'\n state_END = 'end'\n\n class FSMDemo(FSMBase):\n\n _fsm = FSM()\n\n #----------------------------------------------------------------------\n def config(self):\n \"\"\"\"\"\"\n self._fsm.preset_all_states(state_END, state_RUNNING, state_START)\n self._fsm.set_start(state_START)\n self._fsm.set_end(state_END)\n\n\n @_fsm.transfer(orig=state_START, dest=state_RUNNING)\n def action_run(self):\n \"\"\"\"\"\"\n print('Run!')\n\n @_fsm.onstate(state_RUNNING, state_START)\n def say_tired(self):\n \"\"\"\"\"\"\n print('I am tired')\n self.action_stop()\n\n @_fsm.transfer(orig=state_RUNNING, dest=state_END)\n def action_stop(self):\n \"\"\"\"\"\"\n print('Stop working!')\n\n\n s = FSMDemo()\n print(s.state)\n assert s.state == state_START\n s.action_run()\n assert s.state == state_RUNNING\n s.say_tired()\n self.assertRaises(FSMError, callableObj=s.say_tired)\n```\n\n\u5173\u952e\u70b9\u5728\u5b9a\u4e49\u4e00\u4e2a\u7c7b\u53d8\u91cf\u4e3a FSM \u5bf9\u8c61\uff0c\u7136\u540e\u5728 config \u4e2d\u914d\u7f6e\u8fd9\u4e2a FSM \u5bf9\u8c61\u7684\u9884\u8bbe\u72b6\u6001\u548c\u8d77\u59cb\u72b6\u6001\uff0c\u7136\u540e\u5b9a\u4e49\u56de\u8c03\u51fd\u6570\u901a\u8fc7\u4fee\u9970\u8c03\u7528\uff0c\u5982\u679c\u9700\u8981\u9650\u5236\u67d0\u4e00\u4e2a\u65b9\u6cd5\u53ea\u80fd\u5728\u67d0\u4e2a\u7279\u6b8a\u72b6\u6001\u4e0b\u4f7f\u7528\uff0c\u9700\u8981\u4f7f\u7528 onstate \u8fd9\u4e2a\u7279\u6b8a\u4fee\u9970\u5668\u4fee\u9970\u3002\u5f53\u7136\uff0constate \u7684\u53c2\u6570\u4e3a\u4f60\u60f3\u6267\u884c\u4f60\u7684\u8fd9\u4e2a\u653e\u5728\u6240\u5728\u7684\u72b6\u6001\uff1a\u6bd4\u5982\u4f60\u60f3\u8ba9\u4f60\u7684\u65b9\u6cd5\u6267\u884c\u5728 run/waiting/watching \u4e2d\uff0c\u4f60\u5c31\u9700\u8981 `@_fsm.onstate(run, waiting, watching)` \u3002\u5f53\u4f60\u6267\u884c `@_fsm.transfer` \u4fee\u9970\u8fc7\u7684\u65b9\u6cd5\u7684\u65f6\u5019\uff0c\u72b6\u6001\u8f6c\u6362\u88ab\u76f4\u63a5\u6267\u884c\n\n\u5f53\u7136\uff0cFSM \u548c FSMBase \u90fd\u6709\u4e00\u4e2a state \u5c5e\u6027\u6765\u6807\u8bb0\u5f53\u524d\u7684\u72b6\u6001\u3002\n\n#### \u53e6\u4e00\u79cd FSM \u7684\u7528\u6cd5\uff08action \u9a71\u52a8\uff09\n\n\u4f7f\u7528\u52a8\u4f5c\u9a71\u52a8\u7684 FSM \u4e5f\u662f\u975e\u5e38\u6709\u5fc5\u8981\u7684\u3002\u4fee\u9970\u5668\u4f7f\u7528 FSM \u9002\u5408\u5b9e\u4f8b\u4f5c\u4e3a\u4e00\u4e2a\u5355\u4f8b\u3002\n\n```python\n\nstate_START = 'start'\nstate_END = 'end'\nstate_INITINT = 'initing'\nstate_WORKING = 'working'\n_all_states = [state_END,\n state_INITINT,\n state_START,\n state_WORKING]\n\ns = FSM(state_START, state_END, _all_states)\n\n#\n# \u6ce8\u518c\u884c\u4e3a\n#\ns.create_action(action_name='initing', orig=state_START,\n dest=state_INITINT)\nprint('-'*50)\nprint s.state\n\n#\n# \u786e\u8ba4\u521d\u59cb\u72b6\u6001\n#\nself.assertTrue(s.state == state_START)\n\n#\n# \u8c03\u7528\u884c\u4e3a\u5bfc\u81f4 \u72b6\u6001\u53d8\u5316\n#\ns.action('initing')\nassert s.state == state_INITINT\nprint('-'*50)\n```\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/VillanCh/scouter", "keywords": "", "license": "BSD 2-Clause License", "maintainer": "", "maintainer_email": "", "name": "scouter", "package_url": "https://pypi.org/project/scouter/", "platform": "", "project_url": "https://pypi.org/project/scouter/", "project_urls": { "Homepage": "https://github.com/VillanCh/scouter" }, "release_url": "https://pypi.org/project/scouter/0.1.4/", "requires_dist": null, "requires_python": "", "summary": "Watching Data with Callback!", "version": "0.1.4" }, "last_serial": 2953953, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "e305c93ed92aafa6fe07d7ff9dd21723", "sha256": "8598cae16138b0df550f700013f7fd8f3162bbe112456f12e1830713856300c0" }, "downloads": -1, "filename": "scouter-0.1.0.tar.gz", "has_sig": false, "md5_digest": "e305c93ed92aafa6fe07d7ff9dd21723", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3388, "upload_time": "2017-05-24T09:45:01", "url": "https://files.pythonhosted.org/packages/39/9c/4c68f5dde2dff73e93350e34720ca16c4b2d2331207770e752ad6ca0ce6a/scouter-0.1.0.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "3a372735adcf21b2f953d1d5fe2d871f", "sha256": "3cd85dc5c3bf845beb745f36b5074ab666d967530af88df2bee3f4865a25d78c" }, "downloads": -1, "filename": "scouter-0.1.2.tar.gz", "has_sig": false, "md5_digest": "3a372735adcf21b2f953d1d5fe2d871f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3370, "upload_time": "2017-05-28T09:33:35", "url": "https://files.pythonhosted.org/packages/13/2e/dca401a6c790cbca1ba9768469434419e1c0298ae63feac0e00127ad4a40/scouter-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "432656dd8d3e77294030b9222fb746d3", "sha256": "49d24ebcc653dfb2581a1caf3b15404751ad59c18a62439062b137b69a75095c" }, "downloads": -1, "filename": "scouter-0.1.3.tar.gz", "has_sig": false, "md5_digest": "432656dd8d3e77294030b9222fb746d3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4878, "upload_time": "2017-06-01T15:17:33", "url": "https://files.pythonhosted.org/packages/3c/eb/f05f222be73e7e0de2f557c46158c15159c816d1d5fd05f5e9645595f45b/scouter-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "15cf83f88f701f719bf099a0a6084049", "sha256": "12f728650ceb8e2507d0f7ae3e63492d54af139ae6b2f4f3dbfe735fd1f6e22d" }, "downloads": -1, "filename": "scouter-0.1.4.tar.gz", "has_sig": false, "md5_digest": "15cf83f88f701f719bf099a0a6084049", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5347, "upload_time": "2017-06-16T08:13:24", "url": "https://files.pythonhosted.org/packages/a8/0d/958d01518352c9bdc1879c2f75b8614d4fbb7b4d5cd0f05f637eb15cc62c/scouter-0.1.4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "15cf83f88f701f719bf099a0a6084049", "sha256": "12f728650ceb8e2507d0f7ae3e63492d54af139ae6b2f4f3dbfe735fd1f6e22d" }, "downloads": -1, "filename": "scouter-0.1.4.tar.gz", "has_sig": false, "md5_digest": "15cf83f88f701f719bf099a0a6084049", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5347, "upload_time": "2017-06-16T08:13:24", "url": "https://files.pythonhosted.org/packages/a8/0d/958d01518352c9bdc1879c2f75b8614d4fbb7b4d5cd0f05f637eb15cc62c/scouter-0.1.4.tar.gz" } ] }