{ "info": { "author": "Paul Durivage", "author_email": "pauldurivage@gmail.com", "bugtrack_url": null, "classifiers": [ "Intended Audience :: Developers", "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Utilities" ], "description": "# trythatagain\n\n[![Build Status](https://travis-ci.org/angstwad/trythatagain.svg?branch=master)](https://travis-ci.org/angstwad/trythatagain)\n\nThis provides decorators for super simple function/method call retries when an exception is raised.\n\n## Installation\n\n```bash\npip install trythatagain\n```\n\n## Examples\n\nHere's a simple use case: querying the AWS API, knowing you might hit API limits.\n\n```python\nfrom trythatagain import retry\n\n@retry\ndef find_ebs_volumes(unattached=True, no_snapshots=True):\n ...\n\ntry:\n find_ebs_volumes()\nexcept CaughtException as e:\n print('Failed to list EBS volumes')\n print(e.__cause__)\n```\n\nThis will retry calling `func` three times. If was not successful in calling the function without an exception, it will re-raise the exception as `CaughtException`, with the original exception available at the attribute `__cause__`.\n\nRetry as many times as times as necessary:\n\n```python\nfrom trythatagain import retry\n\n@retry(retries=5)\ndef try_five_times():\n raise Exception('This always fails')\n\n@retry(retries=0)\ndef retry_forever():\n raise Exception('Terrible waste of CPU cycles')\n```\n\nRaise immediately on specific exceptions:\n\n```python\n@retry(raise_for=ValueError)\ndef update_cache():\n ...\n```\n\nSuppress re-raising exceptions:\n\n```python\n@retry(reraise=False)\ndef reload_user_data():\n ...\n```\n\nThere's also exponential and linear backoff retries things like cooling down after hitting API limits. In fact, AWS recommends exponential backoff to deal with API limits.\n\n```python\n# waits 1 second, then 4, then 9, etc.\n@retry_exp_backoff(unit=MILLISECONDS)\ndef update_instance_tags():\n ...\n\n@retry_linear_backoff(unit=SECONDS)\ndef scrape_url():\n ...\n```\n\nCustom wait functions are also possible:\n\n```python\ndef fixed(i, unit):\n time.sleep(5 * unit)\n\n@retry(wait_func=fixed, unit=MILLISECONDS)\ndef func():\n ...\n```\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/angstwad/trythatagain", "keywords": "", "license": "LGPL", "maintainer": "", "maintainer_email": "", "name": "trythatagain", "package_url": "https://pypi.org/project/trythatagain/", "platform": "", "project_url": "https://pypi.org/project/trythatagain/", "project_urls": { "Homepage": "https://github.com/angstwad/trythatagain" }, "release_url": "https://pypi.org/project/trythatagain/0.1.3/", "requires_dist": null, "requires_python": "", "summary": "Decorators for functions that you wish to retry", "version": "0.1.3" }, "last_serial": 3928010, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "6cfc805c27db81560e514394c083452c", "sha256": "2820c0fc3b7a81a2b736f8588c753ce31bf2ccbf3ca077c703c20b6af4dfe0f0" }, "downloads": -1, "filename": "trythatagain-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "6cfc805c27db81560e514394c083452c", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 3218, "upload_time": "2018-05-20T12:26:42", "url": "https://files.pythonhosted.org/packages/16/02/fdfa055fa37006abc39087869b53d272685b13f0a951df950cd5cb762277/trythatagain-0.1.0-py3-none-any.whl" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "db12aa78dc727cacef20f720ba90818d", "sha256": "2350eb60b06c20de4535efdae5a134b23afff40f035f9d80d7b0685f123b5f65" }, "downloads": -1, "filename": "trythatagain-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "db12aa78dc727cacef20f720ba90818d", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 4011, "upload_time": "2018-05-20T12:51:28", "url": "https://files.pythonhosted.org/packages/3d/61/b208fc53f50440b2150cbe802da1619dfb84a5d07aae959eaec3c562f1d4/trythatagain-0.1.1-py3-none-any.whl" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "132f407279967ea79c4de4118cc834cb", "sha256": "cc40df6be3ddb3eb9460c1a97812ae4c965a971cd0a2d60a16ce77573d4d6c11" }, "downloads": -1, "filename": "trythatagain-0.1.2-py2-none-any.whl", "has_sig": false, "md5_digest": "132f407279967ea79c4de4118cc834cb", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 4013, "upload_time": "2018-05-20T22:37:04", "url": "https://files.pythonhosted.org/packages/36/3e/f6c79d6cf2ebda6aad194a9eac64854f9d6c5ef6b05a1febe5f93b1e9459/trythatagain-0.1.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4f782a1ae736e96bda6d8c0965c054b4", "sha256": "cff93668edf277c877b458ee6d5cc1bb7b14761a02c5368c81d54f7f4fd9be76" }, "downloads": -1, "filename": "trythatagain-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "4f782a1ae736e96bda6d8c0965c054b4", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 4012, "upload_time": "2018-05-20T16:33:57", "url": "https://files.pythonhosted.org/packages/d2/ab/23a55c2e65c6427a419ff599ad591c93d30cd6c890b5ecc8c707fef0b1a5/trythatagain-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "676ab0069f6292bab777fc691500be08", "sha256": "36f27fb2ff6e9c099a1900c62ca2a0cd28d8586ceef6ca3afecd549e16fbbe8d" }, "downloads": -1, "filename": "trythatagain-0.1.2.tar.gz", "has_sig": false, "md5_digest": "676ab0069f6292bab777fc691500be08", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3286, "upload_time": "2018-05-20T22:34:28", "url": "https://files.pythonhosted.org/packages/c1/08/4d90d295bd8a596238ff2ae4a66127a052060c8a3e1e47f73023590d8f10/trythatagain-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "704e10bfdae1f1019c1eafc738c078e0", "sha256": "c12d5fd3ed1c2787b6d9efaf9e6c2a3a2fcd3efa7e5321dad8d933e7af41ec67" }, "downloads": -1, "filename": "trythatagain-0.1.3-py2-none-any.whl", "has_sig": false, "md5_digest": "704e10bfdae1f1019c1eafc738c078e0", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 4109, "upload_time": "2018-06-04T13:18:42", "url": "https://files.pythonhosted.org/packages/58/4a/54d25e0bbe0370d706fa5fac3134f1e2831c221249df80fba44003538f85/trythatagain-0.1.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f64bda633f626276ed23f41ed88c5ac9", "sha256": "7d8970bce2f486f4ae43e56aa263cadd4c00abf209de3696a331799df6fa7c98" }, "downloads": -1, "filename": "trythatagain-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "f64bda633f626276ed23f41ed88c5ac9", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 4109, "upload_time": "2018-06-04T13:18:12", "url": "https://files.pythonhosted.org/packages/49/af/544a920564722793833e685d4b1a3f07cf66d8d2ce859cfccb8441d1fc3c/trythatagain-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "87ded4039a8f751fcd3b8283858e3626", "sha256": "4d28b94140cce0ed20f9ed84126f0488537e292667624bfcfecfd7477785e0e3" }, "downloads": -1, "filename": "trythatagain-0.1.3.tar.gz", "has_sig": false, "md5_digest": "87ded4039a8f751fcd3b8283858e3626", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3381, "upload_time": "2018-06-04T13:18:10", "url": "https://files.pythonhosted.org/packages/4b/61/508cda0195ffd2efecce6372ce219e55003f3535daa5b6862ceb427cb8a9/trythatagain-0.1.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "704e10bfdae1f1019c1eafc738c078e0", "sha256": "c12d5fd3ed1c2787b6d9efaf9e6c2a3a2fcd3efa7e5321dad8d933e7af41ec67" }, "downloads": -1, "filename": "trythatagain-0.1.3-py2-none-any.whl", "has_sig": false, "md5_digest": "704e10bfdae1f1019c1eafc738c078e0", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 4109, "upload_time": "2018-06-04T13:18:42", "url": "https://files.pythonhosted.org/packages/58/4a/54d25e0bbe0370d706fa5fac3134f1e2831c221249df80fba44003538f85/trythatagain-0.1.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f64bda633f626276ed23f41ed88c5ac9", "sha256": "7d8970bce2f486f4ae43e56aa263cadd4c00abf209de3696a331799df6fa7c98" }, "downloads": -1, "filename": "trythatagain-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "f64bda633f626276ed23f41ed88c5ac9", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 4109, "upload_time": "2018-06-04T13:18:12", "url": "https://files.pythonhosted.org/packages/49/af/544a920564722793833e685d4b1a3f07cf66d8d2ce859cfccb8441d1fc3c/trythatagain-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "87ded4039a8f751fcd3b8283858e3626", "sha256": "4d28b94140cce0ed20f9ed84126f0488537e292667624bfcfecfd7477785e0e3" }, "downloads": -1, "filename": "trythatagain-0.1.3.tar.gz", "has_sig": false, "md5_digest": "87ded4039a8f751fcd3b8283858e3626", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3381, "upload_time": "2018-06-04T13:18:10", "url": "https://files.pythonhosted.org/packages/4b/61/508cda0195ffd2efecce6372ce219e55003f3535daa5b6862ceb427cb8a9/trythatagain-0.1.3.tar.gz" } ] }