{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from gumath import functions as fn\n", "from xnd import xnd" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "class xnd_gumath(xnd):\n", " def __new__(cls, *args, **kwargs):\n", " ops = {\n", " 'add': 'add', 'sub': 'subtract', 'mul': 'multiply',\n", " 'div': 'divide', 'floordiv': 'divide', 'truediv': 'divide',\n", " }\n", " \n", " map_types = {\n", " 'int': 'int32',\n", " 'float': 'float64'\n", " }\n", " \n", " def gen_fn(op, reversed_op=False):\n", " def _target(*args):\n", " l_args = list(args)\n", " for i, v in enumerate(args):\n", " if not isinstance(v, xnd):\n", " _type = type(v)\n", " _type_name = (\n", " _type.__name__ if _type.__name__ not in map_types else\n", " map_types[_type.__name__]\n", " )\n", " l_args[i] = xnd(v, type=_type_name)\n", " \n", " if reversed_op:\n", " l_args = l_args[::-1]\n", " \n", " if any([not v.type.isscalar() for v in l_args]):\n", " for i, v in enumerate(l_args):\n", " if v.type.isscalar():\n", " _type = '1 * {}'.format(str(v.type))\n", " l_args[i] = xnd_gumath([v.value], type=_type)\n", " \n", " return getattr(fn, op)(*tuple(l_args))\n", " return _target\n", " \n", " for py_op, gumath_op in ops.items():\n", " setattr(cls, '__{}__'.format(py_op), gen_fn(gumath_op))\n", " setattr(cls, '__r{}__'.format(py_op), gen_fn(gumath_op, reversed_op=True))\n", " \n", " for op in fn.__dir__():\n", " if op.startswith('__'):\n", " continue\n", " setattr(cls, op, gen_fn(op))\n", " \n", " return super().__new__(cls, *args, **kwargs)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.0" } }, "nbformat": 4, "nbformat_minor": 2 }