{ "info": { "author": "Aric Coady", "author_email": "aric.coady@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "[![image](https://img.shields.io/pypi/v/placeholder.svg)](https://pypi.org/project/placeholder/)\n[![image](https://img.shields.io/pypi/pyversions/placeholder.svg)](https://python3statement.org)\n![image](https://img.shields.io/pypi/status/placeholder.svg)\n[![image](https://img.shields.io/travis/coady/placeholder.svg)](https://travis-ci.org/coady/placeholder)\n[![image](https://img.shields.io/codecov/c/github/coady/placeholder.svg)](https://codecov.io/github/coady/placeholder)\n[![image](https://readthedocs.org/projects/placeholder/badge)](https://placeholder.readthedocs.io)\n[![image](https://requires.io/github/coady/placeholder/requirements.svg)](https://requires.io/github/coady/placeholder/requirements/)\n[![image](https://api.codeclimate.com/v1/badges/3d859b1e30ffac79f10e/maintainability)](https://codeclimate.com/github/coady/placeholder/maintainability)\n\nA `placeholder` uses operator overloading to create partially bound functions on-the-fly.\nWhen used in a binary expression, it will return a callable object with the other argument bound.\nIt's useful for replacing `lambda` in functional programming, and resembles Scala's placeholders.\n\n# Usage\n```python\nfrom placeholder import _ # single underscore\n\n_.age < 18 # lambda obj: obj.age < 18\n_[key] ** 2 # lambda obj: obj[key] ** 2\n```\n\nNote interactive shells use `_` as the previous output, so assign to a different name as needed.\n\n`_` is a singleton of an `F` class, and `F` expressions can also be used with functions.\n\n```python\nfrom placeholder import F\n\n-F(len) # lambda obj: -len(obj)\n```\n\nAll applicable double underscore methods are supported.\n\n# Performance\nEvery effort is made to optimize the placeholder instance.\nIt's 20-40x faster than similar libraries on PyPI.\n\nHowever, there is slight overhead (in CPython) in making an object callable.\nPlaceholders with single operators can access the `func` attribute directly for optimal performance.\n\n```python\n_.age.func # operator.attrgetter('age')\n_[key].func # operator.itemgetter(key)\n```\n\nPerformance should generally be comparable to inlined expressions,\nand faster than lambda. Below are some example benchmarks.\n\n```python\nmin(data, key=operator.itemgetter(-1)) # 22.7 ms\nmin(data, key=_[-1]) # 25.9 ms\nmin(data, key=lambda x: x[-1]) # 27.2 ms\n```\n\n# Installation\n\n $ pip install placeholder\n\n# Tests\n100% branch coverage.\n\n $ pytest [--cov]\n\n# Changes\n1.0\n* Removed `__` (double underscore)\n* Variable arguments of first function\n* Method callers and multi-valued getters\n\n0.7\n* Deprecated `__` (double underscore)\n\n0.6\n* Optimized composite functions\n* Renamed to `_` (single underscore) for consistency\n\n0.5\n* Unary operators\n* `__call__` implements `methodcaller`\n* `__getitem__` supports only single argument\n* Improved error handling\n* `composer` object deprecated in favor of optimized `F` expression\n\n\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/coady/placeholder", "keywords": "functional lambda scala underscore", "license": "Apache Software License", "maintainer": "", "maintainer_email": "", "name": "placeholder", "package_url": "https://pypi.org/project/placeholder/", "platform": "", "project_url": "https://pypi.org/project/placeholder/", "project_urls": { "Documentation": "https://placeholder.readthedocs.io", "Homepage": "https://github.com/coady/placeholder" }, "release_url": "https://pypi.org/project/placeholder/1.0/", "requires_dist": [ "m2r ; extra == 'docs'", "nbsphinx ; extra == 'docs'", "jupyter ; extra == 'docs'" ], "requires_python": ">=2.7", "summary": "Operator overloading for fast anonymous functions.", "version": "1.0" }, "last_serial": 4575981, "releases": { "0.4": [ { "comment_text": "", "digests": { "md5": "4745d8b2bcf82b5a0ee8da812089493a", "sha256": "b828102abe93b2ed56cb2aa184e2398c47f9a451556362d135672939f1b6ae32" }, "downloads": -1, "filename": "placeholder-0.4.tar.gz", "has_sig": false, "md5_digest": "4745d8b2bcf82b5a0ee8da812089493a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3035, "upload_time": "2012-03-07T16:47:18", "url": "https://files.pythonhosted.org/packages/b8/b7/0b1d204ce9fd37a727989222fccf75dc02566e2dbef1f6eb02a1075da4c0/placeholder-0.4.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "3b84c5050ff82ce7c3eb79adce6def72", "sha256": "295b61cc6e97dad24ff14aaddb8afebfa6ef9c6b25029bf5e01bb2425ae190ab" }, "downloads": -1, "filename": "placeholder-0.4.1.tar.gz", "has_sig": false, "md5_digest": "3b84c5050ff82ce7c3eb79adce6def72", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3615, "upload_time": "2013-11-11T02:45:07", "url": "https://files.pythonhosted.org/packages/c9/4a/fd097350dfa27d72ed49d549706b7ec43370ce86f9826f41f9d3e2fc7b72/placeholder-0.4.1.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "c39b74df3cfbe8ddcd6f9a6b677158b4", "sha256": "41e9cbc22e1fef582eefde85355fdeaae1c42932239c27ef28b6c732c352e85b" }, "downloads": -1, "filename": "placeholder-0.5.tar.gz", "has_sig": false, "md5_digest": "c39b74df3cfbe8ddcd6f9a6b677158b4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4258, "upload_time": "2015-09-05T21:49:22", "url": "https://files.pythonhosted.org/packages/cd/56/e9aac9c8124c654ea95c124061611d443fa45b58a7548e8d4e843d4cb9a3/placeholder-0.5.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "d0cba06866e640fed01525c69e165bd9", "sha256": "09fc57c35c21b9664de3d50eff7c4456e9757ec3cb165f4bebef2379fae8e350" }, "downloads": -1, "filename": "placeholder-0.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d0cba06866e640fed01525c69e165bd9", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 5837, "upload_time": "2017-01-02T19:11:36", "url": "https://files.pythonhosted.org/packages/a1/54/714b4556abcb8d549ea277ce84505d42e2c5f1637ff623860eb1a0e18dcd/placeholder-0.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3e162e6c4c4bbab2f31d06ec3b5126fb", "sha256": "c9beec7d0f9ef8db5255937fb7408464dc6e5ab17ecf1b773bb61058d0ee0ff4" }, "downloads": -1, "filename": "placeholder-0.6.tar.gz", "has_sig": false, "md5_digest": "3e162e6c4c4bbab2f31d06ec3b5126fb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5054, "upload_time": "2017-01-02T19:11:35", "url": "https://files.pythonhosted.org/packages/6b/a2/4d7df5f3e67703c8423bb98e93305308bd5cbfd4d2cc2fa02d1613a2cb43/placeholder-0.6.tar.gz" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "a997e8a2212565e0c8ef274dfb5d31a1", "sha256": "652b95cc343020e96f8c35a0fb909dbafa477b0cc06147c70ec0a805f271a788" }, "downloads": -1, "filename": "placeholder-0.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a997e8a2212565e0c8ef274dfb5d31a1", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": "~=2.7, >=3.4", "size": 5352, "upload_time": "2017-12-11T02:23:25", "url": "https://files.pythonhosted.org/packages/a8/32/d78587cb5a1231bf4bca43749898c6c13194aad099108d615c3b34a82d2f/placeholder-0.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "607b5885d6533b8fc867a74ba9155944", "sha256": "7a4fe82e91cfb624026b4e9b5e98fe3bc13b1b08c3b2344e2dd54cdce6b77295" }, "downloads": -1, "filename": "placeholder-0.7.tar.gz", "has_sig": false, "md5_digest": "607b5885d6533b8fc867a74ba9155944", "packagetype": "sdist", "python_version": "source", "requires_python": "~=2.7, >=3.4", "size": 4617, "upload_time": "2017-12-11T02:23:26", "url": "https://files.pythonhosted.org/packages/4e/d6/4da7d592f8c1da0978f7c4996c849842c519b69eb25b9e84a7f975a5ab8b/placeholder-0.7.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "89c27c1d358be81cb185fa8d36087d3e", "sha256": "4e17c9515e748021a2b6ac12198e9b0510bbcb70e422c9c4a4e837e5524027d4" }, "downloads": -1, "filename": "placeholder-0.7.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "89c27c1d358be81cb185fa8d36087d3e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7", "size": 5334, "upload_time": "2017-12-13T02:46:04", "url": "https://files.pythonhosted.org/packages/31/25/d741d4a6e1cd4437b7bd10ce881598f38460e08256bc32187131d3000065/placeholder-0.7.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "13200ea301212c0c74ba87628358989d", "sha256": "c97a40f954517123b7de8b13b1407b2a2d67016e7dd3aca9e33b4f82988a481d" }, "downloads": -1, "filename": "placeholder-0.7.1.tar.gz", "has_sig": false, "md5_digest": "13200ea301212c0c74ba87628358989d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 4594, "upload_time": "2017-12-13T02:46:06", "url": "https://files.pythonhosted.org/packages/ec/1e/131d02cac34d582b4e19b6fae51e65f135909f3aaf03c3cccc16a557c85f/placeholder-0.7.1.tar.gz" } ], "1.0": [ { "comment_text": "", "digests": { "md5": "021d6aec177f314ae58fcabb2e5b1747", "sha256": "963c897a18cc041fb74f7eef94f9d6fc211e7609cd9a9f580861f3c5b8d9cb5d" }, "downloads": -1, "filename": "placeholder-1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "021d6aec177f314ae58fcabb2e5b1747", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7", "size": 4223, "upload_time": "2018-12-08T20:06:55", "url": "https://files.pythonhosted.org/packages/33/f7/cd46e028fdf76742ecd1d2dff3225f33f678ed63f484f8178054cff2c352/placeholder-1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b915d0ba0205cbe428c37fd28187ac5b", "sha256": "60f56db749dce6b3706e513faa4243d2e3059e3f297f5c028f421c7048e6597f" }, "downloads": -1, "filename": "placeholder-1.0.tar.gz", "has_sig": false, "md5_digest": "b915d0ba0205cbe428c37fd28187ac5b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 5108, "upload_time": "2018-12-08T20:06:56", "url": "https://files.pythonhosted.org/packages/35/73/688becabca188d0efbe6dae9fa335af8dabd3609845b8b26475b41cfa8dd/placeholder-1.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "021d6aec177f314ae58fcabb2e5b1747", "sha256": "963c897a18cc041fb74f7eef94f9d6fc211e7609cd9a9f580861f3c5b8d9cb5d" }, "downloads": -1, "filename": "placeholder-1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "021d6aec177f314ae58fcabb2e5b1747", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7", "size": 4223, "upload_time": "2018-12-08T20:06:55", "url": "https://files.pythonhosted.org/packages/33/f7/cd46e028fdf76742ecd1d2dff3225f33f678ed63f484f8178054cff2c352/placeholder-1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b915d0ba0205cbe428c37fd28187ac5b", "sha256": "60f56db749dce6b3706e513faa4243d2e3059e3f297f5c028f421c7048e6597f" }, "downloads": -1, "filename": "placeholder-1.0.tar.gz", "has_sig": false, "md5_digest": "b915d0ba0205cbe428c37fd28187ac5b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 5108, "upload_time": "2018-12-08T20:06:56", "url": "https://files.pythonhosted.org/packages/35/73/688becabca188d0efbe6dae9fa335af8dabd3609845b8b26475b41cfa8dd/placeholder-1.0.tar.gz" } ] }