{ "info": { "author": "Robert Vanden Eynde", "author_email": "robertvandeneynde@hotmail.com", "bugtrack_url": null, "classifiers": [], "description": "Always wanted to add custom operators to your functions ?\n\n```python\na = 2 + (1,2,3) /dot/ (4,5,6) # a = 2 + dot((1,2,3), (4,5,6))\nY = [1,2,7,0,2,0] |no_zero |plus(1) |to(set) # Y == {2,3,8}\nsquare = elipartial(pow, ..., 2) # square = lambda x: pow(x, 2)\ndisplay = hex *compose* ord # display = lambda x: hex(ord(x))\n```\n\nThis example shows how infix operators can be created,\nthe library also introduces bash like _pipes_ and\nshortcuts to create partial functions or function\ncomposition inspired by functional languages.\n\n# Using infix\n\nInfix operators can be created using the `infix` class.\n\nIt works for existing functions, like `numpy.dot`:\n\n```python\nimport numpy\ndot = infix(numpy.dot)\na = (1,2,3) /dot/ (4,5,6) # use as an infix\n```\n\nIf you already have `dot` in your namespace, don't worry, it still works as a function:\n\n```python\na = dot((1,2,3), (4,5,6)) # still works as a function\n```\n\nOr for custom functions as a decorator:\n\n```python\n@infix\ndef crunch(x,y):\n \"\"\"\n Do a super crunchy operation between two numbers.\n \"\"\"\n return x + 2 * y\n\na = 1 |crunch| 2 # a = crunch(1, 2)\na = crunch(1, 2) # still works\nhelp(crunch.function) # to get help about the initial function\n```\n\nAny binary operator can be used, `1 |f| 2` can be written `1 *f* 2`, `1 %f% 2` or `1 << f << 2` but `/` or `|` should be clean for all use cases.\nBeware if you use `**`, the operator is right to left:\n \n```python\nb = 1 **f** 2 # a = f(2, 1)\n```\n\n# Useful for dot and cross product\n\nDot and cross products are used heavily in mathematics and physics as an infix operator `\u00b7` or `\u00d7`.\n\n```python\nimport numpy\ndot = infix(numpy.dot)\n\na = (1,2,3) /dot/ (4,5,6)\na = (1,2,3) |dot| (4,5,6) # same \nr = 2 + (1,2,3) /dot/ (4,5,6) # here \"/\" has priority over \"+\" like in normal python\nr = 2 + (1,2,3) *dot* (4,5,6) # for a dot PRODUCT, \"*\" seems logical\nr = 2 + dot((1,2,3), (4,5,6)) # still works as a function\n\ncross = infix(numpy.cross)\ntau = (1,2) /cross/ (3,4)\nZ = (1,2,3) /cross/ (4,5,6)\n```\n\n# Using `|` for low priority\n\nIn some use cases, one want to mix classic operators with function operators,\nthe `|` operator may be used as a low priority operator.\n\n```python\nY = A + B |dot| C # is parsed as Y = (A + B) |dot| C\nY = A + B /dot/ C # is parsed as Y = A + (B /dot/ C)\n```\n\n# Useful for fractions\n\nWhen using the `fractions` module, often you want to transition from `float` to `Fraction`.\nYour current code uses `/` for division and you can just replace the slashes with `/frac/`, the expression stays natural to read.\n\n```python\nfrom fractions import Fraction\nfrac = infix(Fraction)\na = 1 + 1 / 3 # 1.3333...\na = 1 + 1 /frac/ 3 # Fraction(4, 3)\nb = 2 * Fraction(a + 3, a + 1) # very different from '(a + 3) / (a + 1)'\nb = 2 * (a + 3) /frac/ (a + 1) # almost identical to '(a + 3) / (a + 1)'\n```\n\n# Useful for ranges, do you like `2..5` in ruby?\n\nIn many languages, iterating over a range has a notational shortcut, like `2..5` in ruby.\nNow you can even write `for i in 1 /inclusive/ 5` in python.\n\n```python\n@infix\ndef inclusive(a,b):\n return range(a, b+1)\n\nfor i in 2 /inclusive/ 5:\n print(i) # 2 3 4 5\n\nfor i in inclusive(2, 5):\n print(i) # 2 3 4 5\n```\n\nHowever, redefining `range = infix(range)` is a bad idea because it would break code like `isinstance(x, range)`.\nIn that particuliar example, I would choose `exclusive = infix(range)`.\n\n# Useful for isinstance, do you like `instanceof` in Java and Js?\n\nIn Java and Javascript, testing the class of an object is done via `x instanceof Class`,\nthe python builtin `isinstance` could be enhanced with infix notation or be renamed to `instanceof`.\n\n```python\nisinstance = infix(isinstance)\nassert 1 /isinstance/ int\nassert [] /isinstance/ (list, tuple)\nassert 1 / 2 |isinstance| float\n```\n\n# Useful for pipes: postfix (alias to)\n\nIn bash, a functionality called _pipes_ is useful to reuse an expression and change the behavior by just adding code _at the end_.\nThe library can be used for that.\n\n```python\n@postfix\ndef no_zero(L):\n return [x for x in L if x != 0]\n\n@postfix\ndef plus_one(L):\n return [x+1 for x in L]\n\nY = [1,2,7,0,2,0] |no_zero |plus_one # Y == [2,3,8,3]\nY = plus_one(no_zero([1,2,7,0,2,0])) # Y == [2,3,8,3]\n```\n\nUsing `to = postfix` makes it quite readable in a pipe.\n\n```python\n>>> from funcoperators import postfix as to # funcoperators version 0.x\n>>> from funcoperators import to # funcoperators version 1.x\n>>> 'hello' |to(str.upper) |to(lambda x:x + '!') |to('I said \"{}\"'.format) |to(print)\nI said \"HELLO!\"\n>>> print('I said \"{}\"'.format('hello'.upper() + '!'))\nI said \"HELLO!\"\n```\n\n# Pipes with arguments: pipe factory\n\nSometimes, pipes want extra information, for example in our last example, `no_zero` is a special case of a pipe that filters out a value,\nuse the _pipe factory_ recipe like so:\n\n```python\ndef filter_out(x):\n @postfix\n def f(L):\n return [y for y in L if y != x]\n return f\n\n# shorter with a lambda\ndef filter_out(x):\n return postfix(lambda L:[y for y in L if y != x])\n\nL = [1,2,7,0,2,0] | filter_out(0) # L == [2,3,8,3]\n\nfrom funcoperators import mapwith\ns = '1 2 7 2'.split() | mapwith(int) | to(sum) # s = 12 = sum(map(int, '1 2 7 2'.split()))\n\nfrom funcoperators import mapwith as Map\nfrom funcoperators import filterwith as Filter\nS = '1 2 7 2'.split() | Map(int) | Filter(lambda x:x < 5) | to(set)\n```\n\n# Useful for format and join\n\n```python\n>>> 42 | format /curryright/ 'x'\n'2a'\n>>> formatwith = lambda fmt: postfix(lambda value: format(value, fmt))\n>>> 52 |formatwith('x')\n'2a'\n>>> from funcoperators import to\n>>> 3.1415 |to('{:.02}'.format)\n'3.1'\n>>> [1, 2, 7, 2] |mapwith(str) |to('/'.join) |to(print)\n1/2/7/2\n```\n\n# Function composition (compose, alias circle)\n\nIn mathematics and functional programming languages, [function composition](https://en.wikipedia.org/wiki/Function_composition) is naturally used using a `circle` operator to write things like `h = f \u2218 g`.\n\n```python\ns = hex(ord('A')) # s = '0x41'\n\nfrom funcoperators import compose\ndisplay = hex /compose/ ord\ns = display('A') # s = '0x41'\n\ndisplay = hex *circle* ord\n\nfrom funcoperators import compose as o\ndisplay = hex -o- ord # looks like a dot\n```\n\n`compose` can have more than two functions.\n\n```python\nf = compose(str.upper, hex, lambda x:x+1, ord) # simple function\nf = str.upper /compose/ hex /compose/ (lambda x:x+1) /compose/ ord # operator\n```\n\n## Using call for inline compose\n\n```python\n>>> print(5 + 2 * 10, 'B', sep='/')\n25\n>>> print |call(5 + 2 * 10, 'B', sep='/')\n25/B\n>>> print(','.join('abcdef' + 3 * 'x'))\na,b,c,d,e,f,x,x,x\n>>> print *compose* ' '.join |call('abcdef' + 3 * 'x')\na,b,c,d,e,f,x,x,x\n>>> compose(print, ','.join) |call('abcdef' + 3 * 'x')\na,b,c,d,e,f,x,x,x\n```\n\n```python\n>>> len |infixcall| 'hallo' * 3\n15\n```\n\n```python\n>>> print |callargs| ('a', 5)\na 5\n```\n\n# More partial syntax\n\nThe library adds sugar to functools.partial, using functions called `curry` (and variants like `curryright`, `simplecurry`) and `partially`. The name `curry` comes from other languages.\n\n```python\ndef f(x,y,z):\n return x + y + z\n\nfrom funcoperators import curry\ng = f /curry/ 5\ny = f(2,1) # y = 8\n\nfrom funcoperators import curryright\nsquare = pow /curryright/ 2 # square(x) = x ** 2\nsquare = curryright(pow, 2) # square(x) = x ** 2\n\nfrom funcoperators import provide_right # alias provide_right = curryright\nsquare = provide_right(pow, 2) # square(x) = x ** 2\nsquare = pow /provide_right/ 2 # square(x) = x ** 2\n\nfrom funcoperators import simplecurry\ng = f |simplecurry(1, z=3)\ny = g(2)\n```\n\n`partially` allows to _upgrade_ a function to provide methods like `f.partial` and provides `f[arg]` to curry.\n\n```python\nfrom funcoperators import partially\n@partially\ndef f(x,y,z):\n return x - y + 2 * z\n\nr = f(1,2,3)\ng = f[1] # g = a function with two arguments: y,z\nr = g(2,3)\nr = f[1](2,3)\nr = f[1][2][3]()\n# Notice that \"f[1,2]\" doesn't work because it gives only one argument: a tuple (@see partiallymulti)\n\ng = f[1] # gives positional arguments\ng = f.val(1) # gives positional arguments\ng = f.key(z=3) # gives keyword arguments\ng = f.partial(1, z=3) # gives positional and keyword arguments\n\n# alias part = assuming = given = where = partial\ng = f.part(1, z=3)\ng = f.where(1, z=3)\ng = f.given(1, z=3)\n```\n\n`partiallymulti` allows `f[arg1, arg2]`.\n \n```python\nfrom funcoperators import partiallymulti\n@partiallymulti\ndef f(x,y,z):\n return x - y + 2 * z\n\nr = f(1,2,3)\ng = f[1,2] # g = a function with one argument: z\nr = g(3)\n```\n\n# Using partiallyauto\n\nIn functional languages, function composition is sometimes not dissociable from function call,\n`partiallyauto` only works for methods with N fixed positional arguments.\n\n```python\n@partiallyauto\ndef f(x,y,z):\n return x - y + 2 * z\n\nr = f(1,2,3) # r = 6\nr = f(1)(2)(3) # r = 6\nr = f(1)(2,3) # r = 6\ng = f(1) # g = a function with two arguments \nr = g(2,3) # r = 6\nk = g(2) # k = a function with one argument\n```\n\n# Using Ellipsis\n \nPython's `functools.partial` only works for arguments that will be provided later, one must use keywords arguments.\nHowever, not all functions accept keywords arguments, like the builtin `pow`, one can use `curryright` because pow only has two arguments.\n\n```python\nsquare = curryright(pow, 2) # square(x) = x ** 2\n```\n\nThe library also proposes to use Python's `...` (`Ellipsis`) as a natural placeholder for arguments.\nThe functions using this convention have a name beginning with `eli`.\n \n```python\ntenexp = elipartial(pow, 10) # = pow(10, something)\ny = tenexp(2) # 10 ** 2\nsquare = elipartial(pow, ..., 2) # = pow(something, 2)\ny = square(5) # 5 ** 2\nsquare = pow |elicurry(..., 2) # = pow(something, 2)\ny = square(5) # 5 ** 2\n```\n\nIf you like the `partially` and `partiallymulti` syntax, there is `bracket` that has all the concepts in one class.\n\n```python\n@bracket\ndef f(x,y,z):\n return x - y + 2 * z\n\nr = f(1,2,3)\ng = f[1, ..., 3] # g = a function with one argument: y\nr = g(2)\ng = f.partial(1, ..., 3) # as a method\ng = f.partial(1, z=3) # allowing keyword arguments\n```\n\nHere is a more complex example using `elicurry`, we define `show` to be the `print` function with arguments `1`, _something_, `3` and keyword argument `sep='/'`.\n\n```python\nshow = print |elicurry(1, ..., 3, sep='/')\nshow(2) # prints 1/2/3\n```\n\nLet's note that `elicurry` has many aliases:\n\n```python\nshow = print |elicurry(1, ..., 3, sep='/')\nshow = print |with_arguments(1, ..., 3, sep='/')\nshow = print |deferredcall(1, ..., 3, sep='/')\nshow = print |latercall(1, ..., 3, sep='/')\n```\n \n# More examples\n\nSee more examples in the test cases in [source code](https://github.com/robertvandeneynde/python/blob/master/funcoperators.py).\n\n# Release Notes\nVersion 1.0 created some non backward-compatible change (`call`) and included useful use cases (`to`, `mapwith`)", "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/robertvandeneynde/python", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "funcoperators", "package_url": "https://pypi.org/project/funcoperators/", "platform": "", "project_url": "https://pypi.org/project/funcoperators/", "project_urls": { "Homepage": "https://github.com/robertvandeneynde/python" }, "release_url": "https://pypi.org/project/funcoperators/1.1.3/", "requires_dist": null, "requires_python": "", "summary": "Allow natural function notations like (1,2) *dot* (3,4) for dot((1,2), (3,4)) or 1 /frac/ 3 for Fraction(1,3), pipes and other useful operators to functions.", "version": "1.1.3" }, "last_serial": 4816837, "releases": { "0.2": [ { "comment_text": "", "digests": { "md5": "5aabc5ce39850b4b7fee30cf0368c1b0", "sha256": "e9a7896a8668c72a2a988e2a589228043b5f3c03d93ea498252c915d14c29871" }, "downloads": -1, "filename": "funcoperators-0.2.tar.gz", "has_sig": false, "md5_digest": "5aabc5ce39850b4b7fee30cf0368c1b0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3450, "upload_time": "2018-06-24T18:30:05", "url": "https://files.pythonhosted.org/packages/11/14/cc4bdc54ce6fdcca17274641ae4d1fc588d209330d5e27bc76b1a3d55139/funcoperators-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "6dd2868c3c74a1caba6b4db5ed5f7841", "sha256": "be0daf8f9141f914831f81acd1ca8165bb4b976c185cb0bdb4169a90c42544dd" }, "downloads": -1, "filename": "funcoperators-0.3.tar.gz", "has_sig": false, "md5_digest": "6dd2868c3c74a1caba6b4db5ed5f7841", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4284, "upload_time": "2018-06-24T20:27:12", "url": "https://files.pythonhosted.org/packages/38/c5/7c1b16a0cb3e2242f3ebe40b98746869430164630e11f4f2ceedd344d6be/funcoperators-0.3.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "d3958e2aef03585be435e7e0327de87a", "sha256": "5bfd09eda80e401121e20c6c45922cd4f6fc0d9bb94bf6233831e5a812495441" }, "downloads": -1, "filename": "funcoperators-0.4.tar.gz", "has_sig": false, "md5_digest": "d3958e2aef03585be435e7e0327de87a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4582, "upload_time": "2018-06-24T20:29:01", "url": "https://files.pythonhosted.org/packages/e4/eb/b3890440e9b5693cec822bd32afe88b083f95a5284df97e8a140e950547a/funcoperators-0.4.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "bd4742a6b5a34387995fb317653a21ea", "sha256": "ed88167414743842add4d9e1a8e66c350b287fc3397377a12928a802abcb3f47" }, "downloads": -1, "filename": "funcoperators-0.5.tar.gz", "has_sig": false, "md5_digest": "bd4742a6b5a34387995fb317653a21ea", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4577, "upload_time": "2018-06-24T21:07:05", "url": "https://files.pythonhosted.org/packages/ce/36/f679462b3f682defc1ec095e84fc24b5691f83204600d9862abfc401850a/funcoperators-0.5.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "1a72b0c34b266781ec33c4892618869f", "sha256": "e922b2633c533a4cb2623d1867869552fdb715bf3ed8f8c547378bd8978e334d" }, "downloads": -1, "filename": "funcoperators-0.6.tar.gz", "has_sig": false, "md5_digest": "1a72b0c34b266781ec33c4892618869f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4807, "upload_time": "2018-06-24T21:26:49", "url": "https://files.pythonhosted.org/packages/90/0b/84e771b7fbf52dfea7703ab322713bcbe7a7ba4e4970f6c7cd82c818d043/funcoperators-0.6.tar.gz" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "cde7fcc48b40f609139620844fd7c574", "sha256": "8a61278ba1f9e44d311480cc1a918984b95f59aee9d22a11d00cf34b7c42d6ff" }, "downloads": -1, "filename": "funcoperators-0.7.tar.gz", "has_sig": false, "md5_digest": "cde7fcc48b40f609139620844fd7c574", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5640, "upload_time": "2018-07-08T17:34:34", "url": "https://files.pythonhosted.org/packages/0c/7e/4e69ca98ad29925c50f31731ed9df03e9f2007da7e3d76fbcb3f02bb37ea/funcoperators-0.7.tar.gz" } ], "0.8": [ { "comment_text": "", "digests": { "md5": "ba794cf0b1e14ccd766c064d5844e3c9", "sha256": "ce58d8b39adf2e7a813f4f3df2480db7e9bda0bf3ecdc39221583dc439e05ce3" }, "downloads": -1, "filename": "funcoperators-0.8.tar.gz", "has_sig": false, "md5_digest": "ba794cf0b1e14ccd766c064d5844e3c9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7785, "upload_time": "2018-07-10T00:14:35", "url": "https://files.pythonhosted.org/packages/db/43/9f6bb792629db7eb41cf16f30196d1f4288bf2bb0d0051e3b9712aa92073/funcoperators-0.8.tar.gz" } ], "0.8.1": [ { "comment_text": "", "digests": { "md5": "891bff504fbd544569b5be54dec876f1", "sha256": "9ffc6753b7e0cbdd599a60a43a26885678d51be3c80525bca3a8769dc100c4c5" }, "downloads": -1, "filename": "funcoperators-0.8.1.tar.gz", "has_sig": false, "md5_digest": "891bff504fbd544569b5be54dec876f1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9212, "upload_time": "2018-07-10T00:54:39", "url": "https://files.pythonhosted.org/packages/b1/15/ab6768f0a4b28cd27aef3265d5c826799c4a098e82830e9912bb85b058a0/funcoperators-0.8.1.tar.gz" } ], "0.8.2": [ { "comment_text": "", "digests": { "md5": "7f21dff5a586ea6c07703a5822cc66ca", "sha256": "f8755edb85663a14b0d00113033edce07403ada8825079c479f076d53f064d8b" }, "downloads": -1, "filename": "funcoperators-0.8.2.tar.gz", "has_sig": false, "md5_digest": "7f21dff5a586ea6c07703a5822cc66ca", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9245, "upload_time": "2018-07-10T01:00:02", "url": "https://files.pythonhosted.org/packages/72/fc/888fcb9a8152791d0c3cb3bad7324b6cba026d965d8f4e683ea63356840a/funcoperators-0.8.2.tar.gz" } ], "0.8.3": [ { "comment_text": "", "digests": { "md5": "bb8b096fc3735eaf8eefcebefbdffe1c", "sha256": "c2102314b1bdcfe3b6699859de5519d798212079af0acf5dc9099920ae754a2c" }, "downloads": -1, "filename": "funcoperators-0.8.3.tar.gz", "has_sig": false, "md5_digest": "bb8b096fc3735eaf8eefcebefbdffe1c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10131, "upload_time": "2018-07-10T01:15:07", "url": "https://files.pythonhosted.org/packages/94/a1/3849daf3a899d7417d78de078172ccfc91d787a542e1d9472fca37f60f8a/funcoperators-0.8.3.tar.gz" } ], "0.8.5": [ { "comment_text": "", "digests": { "md5": "2b7e81be346e740b556bfdbd2c931174", "sha256": "0058fdb02a0195e2e125a1a5bfb14860c7168bb843c2d593e281a109c225f338" }, "downloads": -1, "filename": "funcoperators-0.8.5.tar.gz", "has_sig": false, "md5_digest": "2b7e81be346e740b556bfdbd2c931174", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10142, "upload_time": "2018-07-10T01:23:20", "url": "https://files.pythonhosted.org/packages/57/90/926ad2c13db6feeb889b6e0dc57d30f487f395893ff8e5efe6c1a2cf6aaf/funcoperators-0.8.5.tar.gz" } ], "0.8.6": [ { "comment_text": "", "digests": { "md5": "469315c7d8ef209a1057e3d0b5e524ed", "sha256": "b57cc8065794939cf429240d16eb352a9f3b87b5609aca90e03e62d6e55aa8f0" }, "downloads": -1, "filename": "funcoperators-0.8.6.tar.gz", "has_sig": false, "md5_digest": "469315c7d8ef209a1057e3d0b5e524ed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9998, "upload_time": "2018-07-10T03:18:56", "url": "https://files.pythonhosted.org/packages/8f/70/2645435fdb8f23f25cca3714544008ded5f8b2dc56b17271c55da0efef89/funcoperators-0.8.6.tar.gz" } ], "0.9": [ { "comment_text": "", "digests": { "md5": "4e3efbbf369b1ae61979495d2734cdba", "sha256": "a0e1b29b74d42d446e1ab6ca5e187c4f752dced4695183cdb2007680deb07215" }, "downloads": -1, "filename": "funcoperators-0.9.tar.gz", "has_sig": false, "md5_digest": "4e3efbbf369b1ae61979495d2734cdba", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11690, "upload_time": "2018-07-26T15:56:16", "url": "https://files.pythonhosted.org/packages/a8/79/e04c365356f19687497ef38fe77ce2beb3eca0970a20d4eb64f5313c8ca8/funcoperators-0.9.tar.gz" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "c16f9a2c6e8631d9b43c68e5ef7ee41d", "sha256": "7f08102f2818b23048d2a0305d7c96a03a5fc1a5eba76b58019fb85f9f896cfa" }, "downloads": -1, "filename": "funcoperators-0.9.1.tar.gz", "has_sig": false, "md5_digest": "c16f9a2c6e8631d9b43c68e5ef7ee41d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11902, "upload_time": "2018-07-26T21:36:02", "url": "https://files.pythonhosted.org/packages/9e/83/bdd4b961ce248ba759ab4df12fc1066a741d11703dbcd51d91bf92691f4c/funcoperators-0.9.1.tar.gz" } ], "0.9.2": [ { "comment_text": "", "digests": { "md5": "8bf828d32bc8f35538efa634604a0564", "sha256": "792f61ec7d2685e2190bab638993f3ed1fb7767e39b237e2ceb568dfbce152ee" }, "downloads": -1, "filename": "funcoperators-0.9.2.tar.gz", "has_sig": false, "md5_digest": "8bf828d32bc8f35538efa634604a0564", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11898, "upload_time": "2018-07-26T21:50:56", "url": "https://files.pythonhosted.org/packages/c8/8e/4288266ba06bf77f41e437f6a9d88b09ab84aa13321cad20163c72fb9643/funcoperators-0.9.2.tar.gz" } ], "0.9.3": [ { "comment_text": "", "digests": { "md5": "dcf80fd386bfd1a0a974ed2c759a5d47", "sha256": "60e8bb36a670d1f97646364cf7766a44912c8c3394979d4b736e41525f3bb5f6" }, "downloads": -1, "filename": "funcoperators-0.9.3.tar.gz", "has_sig": false, "md5_digest": "dcf80fd386bfd1a0a974ed2c759a5d47", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11974, "upload_time": "2018-07-26T22:10:14", "url": "https://files.pythonhosted.org/packages/b6/ca/d082a7a0ce173642c1077e5d5b41f7231b288467eb3d9c5ee159b616743d/funcoperators-0.9.3.tar.gz" } ], "0.9.4": [ { "comment_text": "", "digests": { "md5": "98cb5ad3f0cfb440da7736548c39a00b", "sha256": "38a9afcfba1efa3dc925693f185edc06c84bd22c1817f98d3d86d1c7e2d48b7a" }, "downloads": -1, "filename": "funcoperators-0.9.4.tar.gz", "has_sig": false, "md5_digest": "98cb5ad3f0cfb440da7736548c39a00b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12357, "upload_time": "2018-08-13T18:17:49", "url": "https://files.pythonhosted.org/packages/f4/f5/2bbb02a8a159bb1ab87a73c1785575bf25fa8dcec508782f0da80035e503/funcoperators-0.9.4.tar.gz" } ], "0.9.5": [ { "comment_text": "", "digests": { "md5": "3c6c2666f9f928c63614c7604e060f95", "sha256": "a7d5718e33230d043a91659f94a9293fad8554261cbbbb1d41a9b3c2303eed06" }, "downloads": -1, "filename": "funcoperators-0.9.5.tar.gz", "has_sig": false, "md5_digest": "3c6c2666f9f928c63614c7604e060f95", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13049, "upload_time": "2018-09-04T12:50:39", "url": "https://files.pythonhosted.org/packages/33/9f/414f31b3ab6d28f0cb87bdd19cc4dd0ebe9e8520528b2177f0984f30b8af/funcoperators-0.9.5.tar.gz" } ], "0.9.6": [ { "comment_text": "", "digests": { "md5": "fbca0ed27fa861149d31c5762ef5e531", "sha256": "c3d8382fb438ba8023d0a48fbd1a48ea5cc2aefaaa4c9a5fabaaefe93f0d698b" }, "downloads": -1, "filename": "funcoperators-0.9.6.tar.gz", "has_sig": false, "md5_digest": "fbca0ed27fa861149d31c5762ef5e531", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12878, "upload_time": "2018-09-04T12:58:15", "url": "https://files.pythonhosted.org/packages/77/9b/7f57a596e5b5681d3b05beb16674004fff41db9106b0fa2ee4f724551bf3/funcoperators-0.9.6.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "b11cb7196bd355c3ec4360c8627dce7e", "sha256": "637b06b5a31c907a643725e4f04b90ea9688b5f6d4807351f1132df195ee49b6" }, "downloads": -1, "filename": "funcoperators-1.1.0.tar.gz", "has_sig": false, "md5_digest": "b11cb7196bd355c3ec4360c8627dce7e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14412, "upload_time": "2019-02-13T16:45:33", "url": "https://files.pythonhosted.org/packages/62/34/01476e6520b314b300aef2724189875986b7b512ca71d84f4e5b349fb766/funcoperators-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "a3aff85f1877dd320f8ff9e491625a9d", "sha256": "7e25eaeb936c399d3778e9919843de422d3bd7346158da291a4413958e97760d" }, "downloads": -1, "filename": "funcoperators-1.1.1.tar.gz", "has_sig": false, "md5_digest": "a3aff85f1877dd320f8ff9e491625a9d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15361, "upload_time": "2019-02-13T17:47:02", "url": "https://files.pythonhosted.org/packages/1b/20/8bf579970d898e36ffecfccf3cb3107d1a93a71d0c362c0dc51049d1b40f/funcoperators-1.1.1.tar.gz" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "3888feb0881127b6cb24ef6233ce24fc", "sha256": "02b1f0423f0d8fb684c38d8611dd006a4ae80138310bc0779965eef805dcc51b" }, "downloads": -1, "filename": "funcoperators-1.1.2.tar.gz", "has_sig": false, "md5_digest": "3888feb0881127b6cb24ef6233ce24fc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15332, "upload_time": "2019-02-13T17:54:56", "url": "https://files.pythonhosted.org/packages/de/00/b86a801bf367a4ae1e5c19ac2205097a122cfae88fbc1df05b363b580728/funcoperators-1.1.2.tar.gz" } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "b5e1d36c37d9ca56fd17e260466a5897", "sha256": "49a2c48bfa99048863668130df1e2bc4741c57c69052e4f3983e949e870b0c0a" }, "downloads": -1, "filename": "funcoperators-1.1.3.tar.gz", "has_sig": false, "md5_digest": "b5e1d36c37d9ca56fd17e260466a5897", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15323, "upload_time": "2019-02-13T17:57:07", "url": "https://files.pythonhosted.org/packages/75/79/31866b4aee1024a1ea75dfab431e555cf7ae15f7c349877526cc0ffae5f2/funcoperators-1.1.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "b5e1d36c37d9ca56fd17e260466a5897", "sha256": "49a2c48bfa99048863668130df1e2bc4741c57c69052e4f3983e949e870b0c0a" }, "downloads": -1, "filename": "funcoperators-1.1.3.tar.gz", "has_sig": false, "md5_digest": "b5e1d36c37d9ca56fd17e260466a5897", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15323, "upload_time": "2019-02-13T17:57:07", "url": "https://files.pythonhosted.org/packages/75/79/31866b4aee1024a1ea75dfab431e555cf7ae15f7c349877526cc0ffae5f2/funcoperators-1.1.3.tar.gz" } ] }