{ "info": { "author": "Amir Rachum", "author_email": "amir@rachum.com", "bugtrack_url": null, "classifiers": [ "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 2" ], "description": "A backport of the `yield from` semantic from Python 3.x to Python 2.7\r\n\r\nIf you want to nest generators in Python 3.x, you can use the ``yield from``\r\nkeywords. This allows you to automatically iterate over sub-generators and\r\ntransparently pass exceptions and return values from the top level caller\r\nto the lowest generator.\r\n\r\n```.py\r\ndef subgen():\r\n yield 2\r\n yield 3\r\n\r\ndef gen():\r\n yield 1\r\n yield from subgen() # Python 3.x only\r\n yield 4\r\n\r\ndef main():\r\n for i in gen():\r\n print i,\r\n\r\n>>> main()\r\n... 1 2 3 4\r\n```\r\n\r\nThis functionality is not available in Python 2.x, and we emulate it using the\r\n`yieldfrom` decorator and the helper `From` class:\r\n\r\n```.py\r\nfrom yieldfrom import yieldfrom, From\r\ndef subgen():\r\n yield 2\r\n yield 3\r\n\r\n@yieldfrom\r\ndef gen():\r\n yield 1\r\n yield From(subgen())\r\n yield 4\r\n\r\ndef main():\r\n for i in gen():\r\n print i,\r\n\r\n>>> main()\r\n... 1 2 3 4\r\n```\r\n\r\nAdvanced usage allows returning a value from the subgenerator using \r\n`StopIteration`. Using `Return` does this conveniently:\r\n\r\n```.py\r\nfrom yieldfrom import yieldfrom, From, Return\r\n\r\ndef subgen():\r\n yield 2\r\n yield 3\r\n Return(100) # Raises `StopIteration(100)`\r\n\r\n@yieldfrom\r\ndef gen():\r\n yield 1\r\n ret = (yield From(subgen()))\r\n yield 4\r\n yield ret\r\n\r\ndef main():\r\n for i in gen():\r\n print i,\r\n\r\n>>> main()\r\n... 1 2 3 4 100\r\n```\r\n\r\nSubgenerators can be nested on multiple levels, each one requiring additional\r\ndecoration by `yieldfrom`:\r\n\r\n```.py\r\ndef subsubgen():\r\n yield 2\r\n\r\n@yieldfrom\r\ndef subgen():\r\n yield From(subsubgen())\r\n yield 3\r\n\r\n@yieldfrom\r\ndef gen():\r\n yield 1\r\n yield From(subgen())\r\n yield 4\r\n\r\ndef main():\r\n for i in gen():\r\n print i,\r\n\r\n>>> main()\r\n... 1 2 3 4\r\n```\r\n\r\nExceptions thrown into the top-level generator can be handled in relevant\r\nsubgenerators:\r\n\r\n```.py\r\ndef subsubgen():\r\n try:\r\n yield 2\r\n except ValueError:\r\n yield 200\r\n\r\n@yieldfrom\r\ndef subgen():\r\n yield From(subsubgen())\r\n yield 3\r\n\r\n@yieldfrom\r\ndef gen():\r\n yield 1\r\n yield From(subgen())\r\n yield 4\r\n\r\ndef main():\r\n try:\r\n g = gen()\r\n while True:\r\n i = g.next()\r\n if i == 2:\r\n i = g.throw(ValueError())\r\n print i,\r\n except StopIteration:\r\n pass\r\n\r\n>>> main()\r\n... 1 200 3 4\r\n```\r\n\r\nNote that if you use `yield From()` on a simple iterable (`list`, \r\n`tuple`, etc) then the individual members of the iterator will be yielded on\r\neach iteration (perhaps in that case you need the usual `yield`).\r\n\r\n```.py\r\n@yieldfrom\r\ndef gen():\r\n yield From([1, 2, 3])\r\n yield [1, 2, 3]\r\n\r\ndef main():\r\n for i in gen():\r\n print i\r\n\r\n>>> main()\r\n... 1\r\n... 2\r\n... 3\r\n... [1, 2, 3]\r\n```\r\n\r\nPassing non-iterable objects to `From` will result in an empty\r\ngenerator that does nothing.\r\n\r\n```.py\r\n@yieldfrom\r\ndef gen():\r\n yield From(None)\r\n yield 1\r\n\r\ndef main():\r\n for i in gen():\r\n print i\r\n\r\n>>> main()\r\n... 1\r\n```\r\n\r\nThis module is an adaptation of the following Python recipe:\r\nhttp://code.activestate.com/recipes/576727 \r\nModifications include bug fixes in exception handling, naming, documentation,\r\nhandling of empty generators, etc.\r\n\r\n\r\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/Nurdok/yieldfrom/", "keywords": "yield,from,yield from,generators,backport,iterators", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "yieldfrom", "package_url": "https://pypi.org/project/yieldfrom/", "platform": "", "project_url": "https://pypi.org/project/yieldfrom/", "project_urls": { "Homepage": "https://github.com/Nurdok/yieldfrom/" }, "release_url": "https://pypi.org/project/yieldfrom/1.0.4/", "requires_dist": null, "requires_python": "", "summary": "A backport of the `yield from` semantic from Python 3.x to Python 2.7", "version": "1.0.4" }, "last_serial": 4563945, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "0158d67d9bca2ce8cf8dbac150b70c29", "sha256": "7ecd25c43b6c4c62998d106c93662dce3a5720ef854fc304f472860abd22bac9" }, "downloads": -1, "filename": "yieldfrom-1.0.0-py2-none-any.whl", "has_sig": false, "md5_digest": "0158d67d9bca2ce8cf8dbac150b70c29", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 4831, "upload_time": "2017-05-01T09:24:46", "url": "https://files.pythonhosted.org/packages/ba/81/975780af5226a6b4ff9d8453e155b7c62873b7c34f8627a4ae83a21f57cc/yieldfrom-1.0.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "15cf2cbfab5385eee28e9c434f11b06e", "sha256": "ccacd050540693b214a521f79f456cc1502d1042b65d2c639d02c7bfcc9e8740" }, "downloads": -1, "filename": "yieldfrom-1.0.0.tar.gz", "has_sig": false, "md5_digest": "15cf2cbfab5385eee28e9c434f11b06e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3495, "upload_time": "2017-05-12T08:34:49", "url": "https://files.pythonhosted.org/packages/87/2b/aa59a1017e5eab96fdd1e99e88353e8656d1e2b903bf78564371331ef246/yieldfrom-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "c081474e77e79aed3820cf97c59b5456", "sha256": "659a6e1b004feba2ab98c9b4f475b5108f5b2ab5fcc93fcb54ccecd4d05bf80b" }, "downloads": -1, "filename": "yieldfrom-1.0.1-py2-none-any.whl", "has_sig": false, "md5_digest": "c081474e77e79aed3820cf97c59b5456", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 4881, "upload_time": "2017-07-10T19:48:48", "url": "https://files.pythonhosted.org/packages/fe/27/fe1b79543720046733768e6ed9076672e50b182d711dd6b43ab95f0d9c45/yieldfrom-1.0.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2087fd4f1cbb29cb6fe175cd8453b9f0", "sha256": "2b476a7a778935eba415feffe93f16b81cf8e646fd2d7fc6cf50039bb4ea1f44" }, "downloads": -1, "filename": "yieldfrom-1.0.1.tar.gz", "has_sig": false, "md5_digest": "2087fd4f1cbb29cb6fe175cd8453b9f0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3681, "upload_time": "2017-07-10T19:48:50", "url": "https://files.pythonhosted.org/packages/da/33/431e2e79550a4b0a0810b4079835812bdbb4f0f08a5d61e1d68aa4b19eea/yieldfrom-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "00be2cbab9bc65cb7a46e69354d3c794", "sha256": "d30454790c70e6c099dbc729a2ff5812f149860d0c2b0093537df0b1cc29d125" }, "downloads": -1, "filename": "yieldfrom-1.0.2-py2-none-any.whl", "has_sig": false, "md5_digest": "00be2cbab9bc65cb7a46e69354d3c794", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 6796, "upload_time": "2017-07-14T19:59:17", "url": "https://files.pythonhosted.org/packages/18/55/cd81b9c079829f289c933244ab9bf2b377d230833c23ab371b8d96775cd5/yieldfrom-1.0.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5cab50e40e0025c6ba9dd8e801ae2b1c", "sha256": "772e46e62d41fb045d22deeaf62fa071673e201ce0478f5477860b663153a03e" }, "downloads": -1, "filename": "yieldfrom-1.0.2.tar.gz", "has_sig": false, "md5_digest": "5cab50e40e0025c6ba9dd8e801ae2b1c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4275, "upload_time": "2017-07-14T19:59:19", "url": "https://files.pythonhosted.org/packages/15/2c/33c6222cc91254e644db3b4b446f03a34a5d47a1a0e17ff8360d2c4a5b5e/yieldfrom-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "a550a37ea37572d04ab4cef40f9c8b12", "sha256": "49b748d2145beb58fca205a6df766e6ae63ab1c36b714e81790bdf7d11b4643c" }, "downloads": -1, "filename": "yieldfrom-1.0.3-py2-none-any.whl", "has_sig": false, "md5_digest": "a550a37ea37572d04ab4cef40f9c8b12", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 6802, "upload_time": "2017-07-15T07:13:37", "url": "https://files.pythonhosted.org/packages/43/72/ba8bf1417282992937f046a687e2d08f793aa8d3af413420509cd4313fc5/yieldfrom-1.0.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1a1c6fd152032d49ccd4ac250aad7746", "sha256": "388004d0ee8854c2ed7a2c87e664aad13acd70c9b33d7f3c441182d37357739b" }, "downloads": -1, "filename": "yieldfrom-1.0.3.tar.gz", "has_sig": false, "md5_digest": "1a1c6fd152032d49ccd4ac250aad7746", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4266, "upload_time": "2017-07-15T07:13:39", "url": "https://files.pythonhosted.org/packages/de/2d/05524f368e691846824d962b64f983e3fde9b8c10839e7efbc1b51d42de3/yieldfrom-1.0.3.tar.gz" } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "c94df2ec41cee7e89dc23f3549ec3026", "sha256": "ab62daf50776de62b7ea98f5264f372c1cb33ca8af1a244bd5c42405381edf8e" }, "downloads": -1, "filename": "yieldfrom-1.0.4-py2-none-any.whl", "has_sig": false, "md5_digest": "c94df2ec41cee7e89dc23f3549ec3026", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 6074, "upload_time": "2018-11-30T19:54:19", "url": "https://files.pythonhosted.org/packages/a7/a9/68ac74ef7b1b8950a8aa40493f99b8756e69cbcbccdd020a523d532697c6/yieldfrom-1.0.4-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "98182ff0e861458e9e3dfaa0d47a47af", "sha256": "09c4e32402ec1c098e66ef5e25e036134f0e84f72ff5817641728707a168f5b3" }, "downloads": -1, "filename": "yieldfrom-1.0.4.tar.gz", "has_sig": false, "md5_digest": "98182ff0e861458e9e3dfaa0d47a47af", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5023, "upload_time": "2018-12-05T14:07:52", "url": "https://files.pythonhosted.org/packages/6e/d2/dc48e4cc6bbe48afd022da745f981cf0437ab7e658de9078bf56747b1d73/yieldfrom-1.0.4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c94df2ec41cee7e89dc23f3549ec3026", "sha256": "ab62daf50776de62b7ea98f5264f372c1cb33ca8af1a244bd5c42405381edf8e" }, "downloads": -1, "filename": "yieldfrom-1.0.4-py2-none-any.whl", "has_sig": false, "md5_digest": "c94df2ec41cee7e89dc23f3549ec3026", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 6074, "upload_time": "2018-11-30T19:54:19", "url": "https://files.pythonhosted.org/packages/a7/a9/68ac74ef7b1b8950a8aa40493f99b8756e69cbcbccdd020a523d532697c6/yieldfrom-1.0.4-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "98182ff0e861458e9e3dfaa0d47a47af", "sha256": "09c4e32402ec1c098e66ef5e25e036134f0e84f72ff5817641728707a168f5b3" }, "downloads": -1, "filename": "yieldfrom-1.0.4.tar.gz", "has_sig": false, "md5_digest": "98182ff0e861458e9e3dfaa0d47a47af", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5023, "upload_time": "2018-12-05T14:07:52", "url": "https://files.pythonhosted.org/packages/6e/d2/dc48e4cc6bbe48afd022da745f981cf0437ab7e658de9078bf56747b1d73/yieldfrom-1.0.4.tar.gz" } ] }