{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Siu expression autocompletion: _.cyl.\\\n", "==========================================\n", "\n", "Note: this is document is based on [PR 248](https://github.com/machow/siuba/pull/248) by [@tmastny](https://github.com/tmastny), and all the discussion there!\n", "\n", "(Drafted on 7 August 2020)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "tl;dr. Implementing autocompletion requires 3 components: identifying the DataFrame to complete, understanding IPython autocompletion, and plugging in to it. The approach we took is to use a user's execution history to identify the DataFrame, and to modify `IPCompleter._jedi_matches`. As discussed in this [PR](https://github.com/machow/siuba/pull/258), a useful approach in the future would be to use a simple regex, like RStudio does." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Problem\n", "\n", "The `_` is meant as a lazy way of representing your data.\n", "Currently, a user autocompleting with _.\\ will not receive suggestions for the data they have in mind.\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "After importing siuba's mtcars data, a user might want to filter by cylinder, but forget its exact name.\n", "\n", "Autocomplete to the rescue! They'd be able to press tab to receive handy suggestions, including column names." ] }, { "attachments": { "9717a3d0-14d1-4f4e-8a86-b9b0fc604ae1.gif": { "image/gif": "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" } }, "cell_type": "markdown", "metadata": {}, "source": [ "![autocomplete.gif](attachment:9717a3d0-14d1-4f4e-8a86-b9b0fc604ae1.gif)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**While an exciting feature, this requires solving hard problems**. There are significant technical challenges related to (1) getting the DataFrame to complete, and (2) plugging into the autocomplete architecture." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For example, the most common approach used for autocompletion--and one used by pandas--is to define a `__dir__` method.\n", "This method then lists out everything you want the user to see when they autocomplete.\n", "\n", "However, because the `_` object doesn't know anything about DataFrames, it doesn't return anything useful." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['_Symbolic__op_invert',\n", " '_Symbolic__ready_to_call',\n", " '_Symbolic__source',\n", " '__abs__',\n", " '__add__',\n", " '__and__']" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from siuba.siu import _\n", "\n", "dir(_)[:6]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this ADR, I will review how we can find the right DataFrame to autocomplete, the state of autocompletion in IPython, and three potential solutions." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Key questions\n", "\n", "I'll review each of these questions below.\n", "\n", "* **framing**: How do we know what DataFrame (e.g. mtcars) the user wants completions for?\n", "* **IPython autocompletion**: What are the key technical hurdles in the existing autocomplete API?\n", "* **glory road**: What are three ways to get completions like in the gif?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Framing: what DataFrame are users looking for?\n", "\n", "Two possibilities come to mind:\n", "\n", "1. The DataFrame being used at the start of a pipe.\n", "2. The last DataFrame they defined or used.\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "### Start of a pipe\n", "\n", "```python\n", "(mtcars\n", " >> filter(_. == 6) # note the tab!\n", " >> mutate(hp2 = _.hp*2)\n", ")\n", "```\n", "\n", "A big challenge here is that this code is not valid python (since it has `_. == 6`). We would likely need to use regex to analyze it. Alternatively, looking at the code they've already run, rather then the code they're on, might be a better place to start.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Last defined or used\n", "\n", "The last defined or used DataFrame is likely impossible to identify, since it'd require knowing the order variables get defined and accessed. However, **static analysis of code history** would let us take a guess. For example, the code below shows some different cases. In each case, we could pick the mtcars or cars2 is being used.\n", "\n", "```python\n", "# import mtcars\n", "from siuba.data import mtcars\n", "\n", "# assign cars2\n", "cars2 = mtcars\n", "\n", "# attribute access cars2\n", "cars2.cyl + 1\n", "```\n", "\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['cars2', 'mtcars']" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import ast\n", "\n", "class FrameDetector(ast.NodeVisitor):\n", " def __init__(self):\n", " self.results = []\n", " super().__init__()\n", " \n", " def visit_Name(self, node):\n", " # visit any children\n", " self.generic_visit(node)\n", " \n", " # store name as a result\n", " self.results.append(node.id)\n", "\n", "visitor = FrameDetector()\n", "\n", "visitor.visit(ast.parse(\"\"\"\n", "from siuba.data import mtcars\n", "cars2 = mtcars + 1\n", "\"\"\"))\n", "\n", "visitor.results" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The tree is traversed depth first, and can be dumped out for inspection. See [greentreesnakes](https://greentreesnakes.readthedocs.io/en/latest/) for a nice python AST primer." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"Module(body=[Assign(targets=[Name(id='cars2', ctx=Store())], value=Name(id='mtcars', ctx=Load()))])\"" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ast.dump(ast.parse(\"cars2 = mtcars\"))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Just knowing the variable names is not enough. We also need to know **which ones are DataFrames**. For our guess, we can use what type of object a variable is at the time the user pressed tab (may differ from when the code is run!).\n", "\n", "Here is an example of one way that can be done in IPython." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "shell = get_ipython()\n", "[k for k,v in shell.user_ns.items() if isinstance(v, pd.DataFrame)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Last DataFrame defined or used seems ideal!\n", "\n", "Once we know the DataFrame the user has in mind, we need to work it into the autocompletion machinery somehow, so that `_.` returns the same results as if that DataFrame were being autocompleted." ] }, { "attachments": { "736ccb80-b514-4140-8fc5-8a7c718ebc30.png": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAArMAAAFuCAYAAACSr5B3AAAGgXRFWHRteGZpbGUAJTNDbXhmaWxlJTIwaG9zdCUzRCUyMmFwcC5kaWFncmFtcy5uZXQlMjIlMjBtb2RpZmllZCUzRCUyMjIwMjAtMDgtMDZUMTUlM0E1MSUzQTE2LjM0NVolMjIlMjBhZ2VudCUzRCUyMjUuMCUyMChNYWNpbnRvc2glM0IlMjBJbnRlbCUyME1hYyUyME9TJTIwWCUyMDEwXzE0XzYpJTIwQXBwbGVXZWJLaXQlMkY1MzcuMzYlMjAoS0hUTUwlMkMlMjBsaWtlJTIwR2Vja28pJTIwQ2hyb21lJTJGODQuMC40MTQ3Ljg5JTIwU2FmYXJpJTJGNTM3LjM2JTIyJTIwZXRhZyUzRCUyMmt3V2xPeGo2dmNIZzFmak94TlY4JTIyJTIwdmVyc2lvbiUzRCUyMjEzLjUuOCUyMiUyMHR5cGUlM0QlMjJnb29nbGUlMjIlM0UlM0NkaWFncmFtJTIwaWQlM0QlMjJUa0dOUWtxYkNFblRzYS1ONGppSSUyMiUyMG5hbWUlM0QlMjJQYWdlLTElMjIlM0U3VmhkYjlzZ0ZQMDFrYnFIVnY2SWslMkI2eFNidDEwMXBWeXNQYVIycUlUWXZCQWx6SCUyQiUyRlc3eERqJTJCU3RLc1M1YXEya3ZDUFlDQmN3NFg0NEUlMkZUUlpmSlVyakc0RUpHM2dPWGd6OHk0SG51WUhqd3A5QmloSVpEJTJGMFNpQ1RGdGxFTnpPZ3ZZa0hIb2huRlJMVWFhaUdZcG1rYkRBWG5KTlF0REVrcDhuYXp1V0R0VVZNVWtSNHdDeEhyb3o4cDFuR0pmbmFjR3I4bU5JcnR5S1BBVmlTb2Ftc0JGU01zOGdia1h3MzhxUlJDbDZWa01TWE1jRmZSVXZiN3NxRjJOUzlKdU42bGd4cE8lMkZJZGIlMkJuaUtybSUyQm1lUHg5cG03ejA4JTJGbFUxNFF5JTJCeDY3V1IxVVJGQU1QQmhReUYxTENMQkVidXEwWWtVR2NmRURPTkFWTGY1SVVRS29BdmdFOUc2c09LaVRBdUFZcDB3VzF1T2FRYmF1RFlMS1pISmtHeFowTkJhQk1tSTZDM3RncFVDNEZ3aUVxSmxBZjBrWVVqVGwlMkZZOGtMVlF0R3BYMHd3RnklMkZRZnNENWN3JTJGcUl3WFFuS2tVY3lwRXAwN1I0SnBLYiUyRlZSV3dsak4lMkJyNVNqTUd1TUlya01kVmtscUlsVlRsc3pEYmZjOEYxSmFsZDR3dVJtaXkyMDklMkJueTNZWVdvdmJMWDV1dzd6ZUwyNjFDJTJCTEdYcW5hN1ozZllDZCUyQnY5MFY0RlQlMkI3dG4xUnUlMkJNWHRmdDhhdG85b2pPNFBjc0xkN08zQjdJY29NMldWNXdkTGI4SGxzbkNuS1Q1MlFwbUEwbGhnVCUyQnFOSWxBWTRaREdhR09BYjZvSTBpMG96QTAweCUyRjZqRUxQT2syaFVwTDhVeW1nZ2tKQ0JmYzBENm5qSFVneEdqRUlReUJWeGpCbnhqV0tSeDdGN1lpb1JpelRacTFNJTJGNCUyQk1ralFVczFkNTNGM2pXcmV3VlRyNSUyQmlUVUFpSktVZWFMRldRVUlnb3ZKdFVvczJGaEZPJTJGTE1Cdm1idyUyRnNHaWU3NTN0b05zNCUyQkllNmVYM2RabGtVRWFXcDRLcW5oY3Bwd3RDUzNMMjR1TCUyRjhWV0pwTFQ4NDFQcEhPeDE5VHdUVGQzRHViVkZ3SThmbjdmdyUyQlBIWjY5JTJGcU1oNW5TSXVua2lJT2VpWHNnMGozNlFlbXRlMjNyMHNieGhiblVtU1RJa0ZJMGJMTkZGbFRmTjhvUEp0dEJraXFqeTRWTmZzdWdxQUlPczc5dkJvMWVKcXk3TGFPcTMyQiUyRnR4YTc4bGR2TGFQMWlqWWtDOVlvVm1FN1gyN3NDSGVDY3QzSWJ1T09ZMFlkSjVUTHRMMmFOOUhPZ3dLdjh5QzM4NkNTaDk2RGxxNWFMZnN2akRiJTJCYjdSWGpPWWQxMmtkZyUyRmolMkJHNTNXdFd3dmVSM2FhZWM5cDUxd0FRQW1LVGlNOEJET2hnJTJGOGh0aTlqZm5WZSUyRjVyaDh3YjNnOGhyRCUyQm1sUUxXWHlUOXE5OCUzRCUzQyUyRmRpYWdyYW0lM0UlM0MlMkZteGZpbGUlM0WWd/rvAAAgAElEQVR4XuydC9xNVfrHn0qUoRRRo0SmNKg0JoaIGmXkfp3KLX/pTiqXlKnJkEgSupgYyaUpd5FuM0NMSqMhMt3klooklTRJ+X++a2ab4+09nOs+e+/z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IDHrO/KcFLhmzRpbsWKFrVq1ylavXm1r1661Xbt2OaFZqVIlJzwRoAhRBGnp0qWdAEWoIlgRrghYb7wgbBG4CF0EL8L3s88+c0IYQYwwRiCvX7/eCeYSJUpY1apV7ayzzrJzzjnHatasadWrV88JCxXqHwGJWf9YqyQREAERyFsCErPR7PqlS5fa4sWLjd/Lli2zk046yQnIGjVqOEGJsDzllFN8a/zmzZudgEZIr1y50gnrjz/+2OrUqWP16tWzBg0auN9K0SIgMRut/lRrREAERCCQBCRmA9ktSVdq69attmDBAlu4cKG98MILduaZZzqBWL9+fatbt66ztAYtYcl95ZVXbMmSJU54v/3223bJJZdYkyZNrGnTplauXLmgVVn1SZKAxGySwPRxERABERCB5AlIzCbPLChPIAanT59us2bNstdee82aNWvmhGDjxo3thBNOCEo1E67Hp59+as8//7wT5PPnz7fatWtbmzZtrH379oEU4wk3LI8/KDGbx52vpouACIiAXwQkZv0inblysMBOnjzZZs+ebR06dLB27dpZy5YtM1dAQHKaO3euzZgxw55++mlr3bq1de7c2VlslcJDQGI2PH2lmoqACIhAaAlIzIaj6zisNW7cOBs/fryVKVPGunTpYh07dnSHs6KeOGQ2depUe+KJJ2z79u121VVX2TXXXOMOlSkFm4DEbLD7R7UTAREQgUgQkJgNdjdySOrBBx+0sWPHOitsjx493KGpfE0cZnvsscectfbGG2+0m266yR1uUwomAYnZYPaLaiUCIiACkSIgMRvM7sQfdvjw4TZy5Ejr1auX+zn11FODWdkc1Grjxo02evRo93PLLbdYv3795Febg344VJESs4cipL+LgAiIgAikTUBiNm2EGc9g2LBhNnjwYGeF7du3ryyPByGM5fq+++5z1tqBAwda//79M94fyjB1AhKzqbPTkyIgAiIgAgkSkJhNEJQPH5szZ44TZFwqcOedd1qVKlV8KDUaRbzzzjs2aNAgdykEC4FWrVpFo2Ehb4XEbMg7UNUXAREQgTAQkJjNfS9xqKlPnz7uMoEhQ4boxH4aXUKkhzvuuMNdDjFixAh3WE4pdwQkZnPHXiWLgAiIQN4QkJjNbVcTJxZ/2O7duzuLolJmCGDhnjBhgvOpJU6tUm4ISMzmhrtKFQEREIG8IiAxm7vu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Sh84cKBNmDDBRo8ebe3bt49Qy8LVFInZcPWXaisCIiACoSQgMZv7btu+fbv16dPHVq5caUOGDLGmTZvmvlIhrcGCBQvsjjvusBo1atiIESOsTJkyIW1JNKotMRuNflQrREAERCDQBCRmg9M9c+bMMSyK55xzjt15551WpUqV4FQu4DV55513bNCgQbZq1Spn4W7VqlXAa5wf1ZOYzY9+VitFQAREIKcEJGZzir/QwocNG+YEWY8ePVzEg5NOOil4lQxIjT7++GMjUsFjjz3mFgL9+/cPSM1UDQhIzGociIAIiIAIZJ2AxGzWEadUwGeffWbDhw93B5fwqeXn1FNPTSmvKD60ceNG5w/LDwfp+vXrZ6VLl45iU0PdJonZUHefKi8CIiAC4SAgMRvsfsLy+OCDD7qIBx06dHDW2jp16gS70lms3bJly5wV9umnn3aRCm666SZZrrPIO92sJWbTJajnRUAEREAEDklAYvaQiALxgV27drmYtOPHj3eHmrp06eIuXyhevHgg6pfNSuzevdtddvDEE08Yh+WuuuoqFzu2RIkS2SxWeWeAgMRsBiAqCxEQAREQgYMTkJgN3wjhxP7kyZNt9uzZzlrL1bgtW7YMX0MOUeO5c+e6K2ixwrZu3do6d+6sSA8h62WJ2ZB1mKorAiIgAmEkIDEbxl77T53xqyVO7axZs+y1116zZs2aWZMmTaxx48Z2wgknhK5hn376qT3//PO2cOFCmz9/vtWuXdvatGnj4sTKHzZ03ekqLDEbzn5TrUVABEQgVAQkZkPVXXEru3XrVsNiixDkVrEzzzzTGjRoYPXr17e6desGUgwixl955RVbsmSJLV682N5++213WxeCnFi75cqVi0bn5HErJGbzuPPVdBEQARHwi4DErF+k/S1n6dKlTiDym0NThPeqWbOmu0zgrLPOsqpVq9opp5ziW6U2b95sa9eutdWrV7vLIVasWGEcbuMwW7169Zzw5rdStAhIzEarP9UaERABEQgkAYnZQHZLxiu1Zs0aJyC5VABBibDkUFnlypWtUqVKVqFCBStfvrydeOKJVrZsWWfJLVWqlJUsWdIdMitWrJgVKVLEbRvv27fP9u7da99++61xOOurr76ynTt3OreHbdu22SeffGJbtmyxTZs22fr1623dunXusBYCGiHNpRAI6+rVq2e8ncowWAQkZoPV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REAERCBkBCRmQ9ZhyVQXSyyHvZ555hk777zzknlUn80Cgddff92aN2/uDoVhqVUSAREQAREQARFIn4DEbPoMA5kDArZz584uakGtWrUCWcd8rNTy5ctdlIPJkyc7YaskAiIgAiIgAiKQHgGJ2fT4BfLpFStWuMNG8+bNs0aNGgWyjvlcqZdeeslatGhhHMqrWbNmPqNQ20VABERABEQgbQISs2kjDFYGX375pdWpU8f69etnXbt2DVblVJv9BCZNmmTDhw+3ZcuW2THHHCMyIiACIiACIiACKRKQmE0RXFAfI2pBpUqVbOjQoUGtour1XwIDBgyw9evXuygHSiIgAiIgAiIgAqkRkJhNjVsgnyKe6dy5c41tbKVwEMANpGXLli7+r5IIiIAIiIAIiEDyBCRmk2cWyCfee+89q1q1qq1cudKqVasWyDqqUj8m8NZbb1mNGjVs7dq1dvrppwuRCIiACIiACIhAkgQkZpMEFtSPt2/f3oXfwldWKVwE8J0lbNf06dPDVXHVVgREQAREQAQCQEBiNgCdkG4V5s+fbwMHDnRWWaVwEsA6O3jwYGvWrFk4G6Bai4AIiIAIiECOCEjM5gh8JoutV6+e9erVyzp06JDJbJWXjwSefvppGz16tC1dutTHUlWUCIiACIiACISfgMRsyPuQyxHuueceF+JJKdwECKl2++236zKFcHejai8CIiACIuAzAYlZn4FnurimTZsa4bi47Usp3AS4FYwwXQsWLAh3Q1R7ERABERABEfCRgMSsj7AzXdQ777xjDRs2tI8//jjTWSu/HBE46aSTbNGiRValSpUc1UDFioAIiIAIiEC4CEjMhqu/DqgtB4Y+++wze+CBB0LcClU9lsDNN99spUuXdgf6lERABERABERABA5NQGL20IwC+wlCcd1///12wQUXBLaOqlhyBF5++WW79dZbXaguJREQAREQAREQgUMTkJg9NKNAfmLLli12zjnn2Pbt2wNZP1UqdQJlypSxVatWWfny5VPPRE+KgAiIgAiIQJ4QkJgNaUcTyunJJ5+02bNnh7QFqnY8Aq1bt7bLL79codY0RERABERABEQgAQISswlACuJH+vfvb8cee6wL5RSG9P3337tqHnHEEWGobk7rSKi1L774woYNG5bTeqhwERABERABEQgDAYnZMPRSIXVs3ry59ejRw1q0aJHTFuzevdt+8pOf2HvvvWc/+9nP4tbluuuusxNPPNHuuuuujNY30fIzWmiWM5s3b5499thjRgxhJREQAREQAREQgYMTkJgN6QipXr26i0nK71ymH374wd1a9ctf/tKKFy/uu5hNtPxcMkq27DVr1rjYwfxWEgEREAEREAERkJiN5BjgkBBxZgnj5FfCP5crV1esWGGtWrWysWPHWrFixeziiy+2adOm2aZNm+zee+81LIukv//97y5s2IwZMwzLLGHEPvnkE1u5cqW75YrnjzvuOHvjjTfcLWZLliwxIjTgQlG/fv0fNSud8mMz+8tf/uL8jbEosyCoWrWqPfroo1a2bFlr3LixjRs3zs4991z3SM+ePZ3F+aabbvILs+NEnFkd7vMNuQoSAREQAREIMQFZZkPaeUceeaR98803VqRIEV9agLA64YQTjINnCFDCR3Xt2tWuvfZaJwrfffdde//99+3qq6+2zZs3uzpxk1WvXr1s3bp1TswiGAcNGmSVKlVyz7dp08YeeeQRJ9y4/AG3CcTlwoULnVXysMMO29+2dMuPhUQZHLCivC5dutjw4cPt8MMPtzlz5hhXyiJof//739uuXbusZMmShvi96KKLfOFMIXv37rWjjz7avvvuO9/KVEEiIAIiIAIiEFYCErMh7Ll9+/a5g1RssfuVsLqeeuqpNmbMGLvyyittx44dTkyfcsopCYtZLLLLli1zVX744Yfttttusy+//NIJ2EsvvdSJ17lz57qrecn7qKOO2t+8dMsvTMz++9//dpZlxHeFChXs66+/tj/96U9OYL/11ltO3CJ2aatfiwavnohrP/vXr3GkckRABERABEQg0wQkZjNN1Kf8/LbM0iwuaOjTp49rYdOmTZ0LAbFQ41lmEaa33HLLfsssrhF/+MMf3PO4INSrV89ZIdnWv/vuu23btm122mmn2QcffPAjMZtu+QXF7NChQ10sVxKikcUBQvvkk092Ap0DbUOGDLESJUo4Ae9nkmXWT9oqSwREQAREIOwEJGZD2oN++8zix/n55587offKK6+4qAT8N6fuY8UsVtutW7c6qojAUaNG7Rez/BtWT9Ljjz/urKATJ050PqmTJk1ycVVxV+AyiIKW2XTLLyhm+/btu98d4u2337af//znrp6IaUQ2PsG4RMyfP9/3G9bkMxvSSalqi4AIiIAI5ISAxGxOsKdfqN/RDDikhV8rrgIIPsQsB8HwofXELAIUIbp48WJ3qKpBgwbGVr7nMzt16lR32AurcseOHa1Zs2bOF7V27drGjWYcZuPAFQKZLf+iRYu6Q2KEH9u5c2da5W/cuNFdMHH99dfbrFmznM/ss88+6+qIu8NTTz3l6oA7AYKbz3Eg7KOPPvI9Nq6iGaQ/P5SDCIiACIhA/hCQmA1pX+ciziyW0+nTpzuRV6pUKWdVrVGjxv44sxUrVnS+ry+++KI7OIVQXb169X4xi/h9/fXXHfGzzz7bnnvuORd7lrZwWIzUu3dvFxmhUaNGNn78eBfuC9HZpEkTZ7lNtXwOcZEnopgDZhxU45AVrg24FmAZ9g55IWBxn0Dk4o7gd1KcWb+JqzwREAEREIEwE5CYDWnv5eoGMCyce/bssdNPPz0uOcJvHX/88c6yWjBhqeXvHCaLjVbAISyewcrLZ/hBMBdM6ZZPfhw4GzlypPOR3bBhg4uuwIErL7HNjxsHLg8Ha2e2ho5uAMsWWeUrAiIgAiIQRQISsyHtVbb3iZXK1rlScgQ8Mbt8+fIfPYgLAhZhhDjRDHKRWrdu7dwgsEQriYAIiIAIiIAIHJyAxGxIRwj+nfinKrB+8h24du1aQ8hyWK1gIgIDTBGSuErkImEVJtICrg5KIiACIiACIiACErORHQPclkW4rAsuuCCybcy3hr388svuQgnPtzjf2q/2ioAIiIAIiECyBGSZTZZYgD4/ePBgd/Up8V6VokHg5ptvdlEdBg4cGI0GqRUiIAIiIAIikGUCErNZBpzN7N955x0Xrurjjz/OZjHK20cCJ510ki1atMhd8askAiIgAiIgAiJwaAISs4dmFOhPcBPXZZdd5q6AVQo3gcmTJ7tIC16YsnC3RrUXAREQAREQAX8ISMz6wzlrpTzzzDNGKCfCTCmFm0CdOnXs9ttvd3F3lURABERABERABBIjIDGbGKdAf4rrV3v16qVQToHupYNXjlBro0ePtqVLl4a4Faq6CIiACIiACPhPQGLWf+YZL3H+/PnuwBBXzSqFkwA3qXGgjyt+lURABERABERABBInIDGbOKtAf7J9+/ZGqK5+/foFup6q3I8JDB8+3IXi4qpeJREQAREQAREQgeQISMwmxyuwn37vvfesatWqzjpbrVq1wNZTFTuQABc4cPkFv3Nxda76QwREQAREQATCTkBiNuw9GFP/MWPGGDdYvfTSSxFqVbSb0qhRI2vZsqX17Nkz2g1V60RABERABEQgSwQkZrMENlfZEqarUqVKNnTo0FxVQeUmSGDAgAG2fv16F45LSQREQAREQAREIDUCErOpcQvsU19++aUR4gnf2a5duwa2nvlesUmTJhm+soRUO+aYY/Idh9ovAiIgAiIgAikTkJhNGV1wH1yxYoXVr1/f5s2bZ2xjKwWLAG4gLVq0sCVLlljNmjWDVTnVRgREQAREQARCRkBiNmQdlmh1uUyBW8FeeOEFq1WrVqKP6XNZJrB8+XK75JJLjNu+dDlClmErexEQAREQgbwgIDEb4W6eNm2a3XLLLYawJWyXUm4JEH4LATty5Ei74oorclsZlS4CIiACIiACESEgMRuRjozXjClTpljv3r1t5syZ1qBBg4i3NrjNW7x4sbVt29ZGjRplnTp1Cm5FVTMREAEREAERCBkBidmQdVgq1Z01a5YR5QBLbbt27VLJQs+kQWDGjBnOEkvUgjZt2qSRkx4VAREQAREQAREoSOD/27vzYJvrP47jb2WQKJOdXGRNoQiRrUyMPYppk2SbSmgsTSVbqazZG/vSaKFEJWklSiq7hMZ2JbsUKWX5zes9871zf+rqnttx7/ne8/zM3Lnce87nfD6P7/eP132fz+dzCLNxck9os9F9993n55n26dMnTmad8dMcPny46fzfOXPm+KY8GgIIIIAAAghEV4AwG13PmO4tMTHROnToYAkJCTZp0iTLli1bTI83zIP7888/rWvXribzGTNmuDkNAQQQQAABBKIvQJiNvmnM96hNYTrlYPz48Va/fv2YH2/YBrh06VLr1q2bn1qgzV40BBBAAAEEELh4AoTZi2cb0z3PmzfPunfvbh07drTnnnsupscapsH169fPpk2bZmPHjrU2bdqEaeiMFQEEEEAAgVAKEGZDedmiM+jDhw9b7969bd26dTZkyBBr2rRpdDqOw14WLVpkTz/9tN1www02YsQIy5cvXxwqMGUEEEAAAQTSX4Awm/7mMfeKCxYsMFUUK1eubP3797dy5crF3BhjdUBbt261wYMH2/r1673Cfccdd8TqUBkXAggggAACmVKAMJspL2vaJjV06FAPZJ07d/YTDwoXLpy2juLgWfv27TOdVDBlyhT/Q+CJJ56Ig1kzRQQQQAABBGJP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" } }, "cell_type": "markdown", "metadata": {}, "source": [ "## IPython Autocompletion\n", "\n", "This section will go into great detail about how IPython's autocomplete works, to set the stage for technical solutions. Essentially, when a user interacts with autocompletion, there are 3 main libraries involved: ipykernel, IPython, and jedi. This is shown in the dependency graph below.\n", "\n", "![completer_modules.png](attachment:736ccb80-b514-4140-8fc5-8a7c718ebc30.png)\n", "\n", "Essentially, our challenge is figuring how where autocomplete could fit in. Just to set the stage, the IPython IPCompleter uses some of its own useful completion strategies, but the bulk of where we benefit comes from its use of the library jedi.\n", "\n", "In the sections below, I'll first give a quick preview of how jedi works, followed by two sequence diagrams of how it's intergrated into the ipykernel." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Jedi completion\n", "\n", "At it's core, jedi is easy to use, and does a mix of static analysis and object evaluation. It's super handy!\n", "\n", "The code below shows how it might autocomplete a DataFrame called `zzz`, where we define `zzz` to really be the `mtcars` data." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(, 'function')" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import jedi\n", "from siuba.data import mtcars\n", "\n", "interpreter = jedi.Interpreter('zzz.m', [{'zzz': mtcars}])\n", "completions = list(interpreter.complete())\n", "\n", "entry = completions[0]\n", "entry, entry.type" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice that it knows the suggestion `mad` is a function! For a column of the data, it knows that it's not a function, but an instance.\n", "\n", "The IPython shell has an instance of it's IPCompleter class, and it's `_jedi_matches` method is responsible for doing the jedi stuff." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[,\n", " ,\n", " ,\n", " ,\n", " ]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from siuba.data import mtcars\n", "shell = get_ipython()\n", "\n", "df_auto = list(shell.Completer._jedi_matches(7, 0, \"mtcars.\"))\n", "\n", "df_auto[:5]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "While this simple description captures the main thrust of how autocomplete works, the full dynamics include some more features such as entry hooks, and some shuffling things around (since the IPCompleter is deprecating its old methods for completing).\n", "\n", "The sequence diagrams below show how the kernel sets up autocomplete, and how a specific autocomplete event is run." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Links to code used for diagrams:\n", "\n", "* [ipykernel 5.3.4](https://github.com/ipython/ipykernel/blob/5.3.4/ipykernel/ipkernel.py#L64)\n", "* [IPython 7.17.0 - completer.py](https://github.com/ipython/ipython/blob/7.17.0/IPython/core/completer.py#L1861)\n", "* [IPython interactive shell](https://github.com/ipython/ipython/blob/7.17.0/IPython/core/interactiveshell.py#L676)\n", "\n", "\n", "#### IPython hooks\n", "\n", "ipykernel sets everything up, and also exposes methods for using IPCompleter hooks.\n", "\n", "\n", "[![](https://mermaid.ink/img/eyJjb2RlIjoic2VxdWVuY2VEaWFncmFtXG4gIGlweWtlcm5lbC0-PmlweWtlcm5lbDogU0VUVVBcbiAgaXB5a2VybmVsLT4-K0ludGVyYWN0aXZlU2hlbGw6IHNlbGYuc2hlbGwgPSBfX2luaXRfXyguLi4pXG4gIEludGVyYWN0aXZlU2hlbGwtPj5JbnRlcmFjdGl2ZVNoZWxsOiBpbml0X2NvbXBsZXRlcigpXG4gIEludGVyYWN0aXZlU2hlbGwtPj5JUENvbXBsZXRlcjogX19pbml0X18oc2hlbGw9c2VsZiwgLi4uKVxuICBJbnRlcmFjdGl2ZVNoZWxsLT4-SVBDb21wbGV0ZXI6IHNldCBjdXN0b21fY29tcGxldGVycyA9IFN0ckRpc3BhdGNoKClcbiAgSW50ZXJhY3RpdmVTaGVsbC0-PkludGVyYWN0aXZlU2hlbGw6IHNldF9ob29rKCdjb21wbGV0ZV9jb21tYW5kJywgLi4uKVxuICBJbnRlcmFjdGl2ZVNoZWxsLS0-Pi1pcHlrZXJuZWw6IC5cbiAgIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifSwidXBkYXRlRWRpdG9yIjpmYWxzZX0)](https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoic2VxdWVuY2VEaWFncmFtXG4gIGlweWtlcm5lbC0-PmlweWtlcm5lbDogU0VUVVBcbiAgaXB5a2VybmVsLT4-K0ludGVyYWN0aXZlU2hlbGw6IHNlbGYuc2hlbGwgPSBfX2luaXRfXyguLi4pXG4gIEludGVyYWN0aXZlU2hlbGwtPj5JbnRlcmFjdGl2ZVNoZWxsOiBpbml0X2NvbXBsZXRlcigpXG4gIEludGVyYWN0aXZlU2hlbGwtPj5JUENvbXBsZXRlcjogX19pbml0X18oc2hlbGw9c2VsZiwgLi4uKVxuICBJbnRlcmFjdGl2ZVNoZWxsLT4-SVBDb21wbGV0ZXI6IHNldCBjdXN0b21fY29tcGxldGVycyA9IFN0ckRpc3BhdGNoKClcbiAgSW50ZXJhY3RpdmVTaGVsbC0-PkludGVyYWN0aXZlU2hlbGw6IHNldF9ob29rKCdjb21wbGV0ZV9jb21tYW5kJywgLi4uKVxuICBJbnRlcmFjdGl2ZVNoZWxsLS0-Pi1pcHlrZXJuZWw6IC5cbiAgIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifSwidXBkYXRlRWRpdG9yIjpmYWxzZX0)\n", "\n", "(Note that InteractiveShell and IPCompleter come from IPython)\n", "\n", "A key here is that one hook, set by the `set_hooks` method is configured using something called `StrDispatch`\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[()>]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.utils.strdispatch import StrDispatch\n", "\n", "dis = StrDispatch()\n", "\n", "dis.add_s('hei', lambda: 1)\n", "dis.add_re('_\\\\..*', lambda: 2)\n", "\n", "# must be exactly hei\n", "list(dis.flat_matches('hei'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This let's you set hooks that only fire when a specific match is in the code being completed. For example..." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[()>]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# needs to match regex abc.*\n", "list(dis.flat_matches('_.abc'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For example, the code below should make `_.a` complete to `_.ab`." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "shell = get_ipython()\n", "shell.set_hook('complete_command', lambda shell, event: ['_.ab'], re_key = '_\\\\.a.*')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This would be a really promising avenue. However, as I'll show in the next section, hooks must return a list of strings, so cannot give the nice color info with completions, even if they use jedi under the hood." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### IPython _jedi_matches\n", "\n", "The following diagrams illustrates what the path through a single autocompletion event (e.g. pressing tab) looks like. Note that because IPCompleter is transitioning to a new setup, there is some shuffling around that goes on (e.g. do_complete calls _experimental_do_complete, etc..).\n", "\n", "[![](https://mermaid.ink/img/eyJjb2RlIjoic2VxdWVuY2VEaWFncmFtXG4gIFxuICBcbiAgaXB5a2VybmVsLT4-aXB5a2VybmVsOiBkb19jb21wbGV0ZShjb2RlLCAuLi4pXG4gIGlweWtlcm5lbC0-PmlweWtlcm5lbDogX2V4cHJpbWVudGFsX2RvX2NvbXBsZXRlKGNvZGUsIC4uLilcblxuICBwYXJ0aWNpcGFudCBJbnRlcmFjdGl2ZVNoZWxsXG5cbiAgaXB5a2VybmVsLT4-SVBDb21wbGV0ZXI6IGNvbXBsZXRpb25zKC4uLilcbiAgSVBDb21wbGV0ZXItPj5JUENvbXBsZXRlcjogX2NvbXBsZXRpb25zKC4uLilcbiAgSVBDb21wbGV0ZXItPj4rSVBDb21wbGV0ZXI6IF9jb21wbGV0ZSguLi4pXG4gIElQQ29tcGxldGVyLT4-K0lQQ29tcGxldGVyOiBfamVkaV9tYXRjaGVzKC4uLilcbiAgSVBDb21wbGV0ZXItPj5qZWRpLkludGVycHJldGVyOiBfX2luaXRfXyguLi4pXG4gIG5vdGUgb3ZlciBqZWRpLkludGVycHJldGVyOiBoYXMgc2hlbGwgbmFtZXNwYWNlXG4gIElQQ29tcGxldGVyLT4-LWplZGkuSW50ZXJwcmV0ZXI6IGNvbXBsZXRpb25zKClcbiAgbm90ZSBvdmVyIElQQ29tcGxldGVyOiBjdXN0b20gaG9va3MgKG11c3QgcmV0dXJuIExpc3Rbc3RyXSlcbiAgSVBDb21wbGV0ZXItPj5JUENvbXBsZXRlcjogbWF0Y2ggdy8gc2VsZi5tYXRjaGVycyAoZS5nLiBob29rcylcbiAgSVBDb21wbGV0ZXItPj4tSVBDb21wbGV0ZXI6IGRpc3BhdGNoX2N1c3RvbV9jb21wbGV0ZXIodGV4dClcbiAgbm90ZSBvdmVyIElQQ29tcGxldGVyOiBob29rcyBtdXN0IHJldHVybiBzdHJpbmdzLCBzbyBubyB0eXBlIGluZm9cbiAgSVBDb21wbGV0ZXItPj5JUENvbXBsZXRlcjogcHJvY2VzcyBtYXRjaGVzLCB3cmFwIGluIENvbXBsZXRpb25cblxuICBcbiAgSVBDb21wbGV0ZXItLT4-aXB5a2VybmVsOiBJdGVyW0NvbXBsZXRpb25dXG5cbiIsIm1lcm1haWQiOnsidGhlbWUiOiJkZWZhdWx0In0sInVwZGF0ZUVkaXRvciI6ZmFsc2V9)](https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoic2VxdWVuY2VEaWFncmFtXG4gIFxuICBcbiAgaXB5a2VybmVsLT4-aXB5a2VybmVsOiBkb19jb21wbGV0ZShjb2RlLCAuLi4pXG4gIGlweWtlcm5lbC0-PmlweWtlcm5lbDogX2V4cHJpbWVudGFsX2RvX2NvbXBsZXRlKGNvZGUsIC4uLilcblxuICBwYXJ0aWNpcGFudCBJbnRlcmFjdGl2ZVNoZWxsXG5cbiAgaXB5a2VybmVsLT4-SVBDb21wbGV0ZXI6IGNvbXBsZXRpb25zKC4uLilcbiAgSVBDb21wbGV0ZXItPj5JUENvbXBsZXRlcjogX2NvbXBsZXRpb25zKC4uLilcbiAgSVBDb21wbGV0ZXItPj4rSVBDb21wbGV0ZXI6IF9jb21wbGV0ZSguLi4pXG4gIElQQ29tcGxldGVyLT4-K0lQQ29tcGxldGVyOiBfamVkaV9tYXRjaGVzKC4uLilcbiAgSVBDb21wbGV0ZXItPj5qZWRpLkludGVycHJldGVyOiBfX2luaXRfXyguLi4pXG4gIG5vdGUgb3ZlciBqZWRpLkludGVycHJldGVyOiBoYXMgc2hlbGwgbmFtZXNwYWNlXG4gIElQQ29tcGxldGVyLT4-LWplZGkuSW50ZXJwcmV0ZXI6IGNvbXBsZXRpb25zKClcbiAgbm90ZSBvdmVyIElQQ29tcGxldGVyOiBjdXN0b20gaG9va3MgKG11c3QgcmV0dXJuIExpc3Rbc3RyXSlcbiAgSVBDb21wbGV0ZXItPj5JUENvbXBsZXRlcjogbWF0Y2ggdy8gc2VsZi5tYXRjaGVycyAoZS5nLiBob29rcylcbiAgSVBDb21wbGV0ZXItPj4tSVBDb21wbGV0ZXI6IGRpc3BhdGNoX2N1c3RvbV9jb21wbGV0ZXIodGV4dClcbiAgbm90ZSBvdmVyIElQQ29tcGxldGVyOiBob29rcyBtdXN0IHJldHVybiBzdHJpbmdzLCBzbyBubyB0eXBlIGluZm9cbiAgSVBDb21wbGV0ZXItPj5JUENvbXBsZXRlcjogcHJvY2VzcyBtYXRjaGVzLCB3cmFwIGluIENvbXBsZXRpb25cblxuICBcbiAgSVBDb21wbGV0ZXItLT4-aXB5a2VybmVsOiBJdGVyW0NvbXBsZXRpb25dXG5cbiIsIm1lcm1haWQiOnsidGhlbWUiOiJkZWZhdWx0In0sInVwZGF0ZUVkaXRvciI6ZmFsc2V9)\n", "\n", "Intriguingly, ipykernel also jumps over InteractiveShell, accessing the shell's Completer instance directly. Then, essentially 3 critical steps are run: jedi completions, two kinds of hooks, and wrapping each result in a simple Completion class." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Glory road: three technical solutions\n", "\n", "Essentially, the dynamics described above leave us with three potential solutions for autocomplete:\n", "\n", "* hooks (without type info)\n", "* modify siu's `Symbolic.__dir__` method\n", "* monkey patch Completer's _jedi_matches method\n", "\n", "To foreshadow, the last is the only one that will give us those sweet colored type annotations, so is preferred!\n", "\n", "### Option 1: IPython.Completer hooks\n", "\n", "While hooks are an interesting approach, they currently require you to return a list of strings. Only `Completer._jedi_matches` can return the enriched suggestions, and it requires strings from hooks.\n", "\n", "(**NOTE:** if you make changes to the code below, you may need to restart your kernel and re-run the cell's code.)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "#TODO: make workable\n", "from siuba.data import mtcars\n", "from siuba import _\n", "import sys\n", "\n", "# will use zzz. for this example\n", "zzz = _\n", "\n", "\n", "def hook(shell, event):\n", " # change the completers namespace, then change it back at the end\n", " # would likely need to be done in a context manager, down the road!\n", " old_ns = shell.Completer.namespace\n", " \n", " target_df = shell.user_ns[\"mtcars\"]\n", " shell.Completer.namespace = {**old_ns, \"zzz\": target_df}\n", "\n", " # then, run completion method\n", " col_num, line_num = len(event.symbol), 0\n", " completions = shell.Completer._jedi_matches(col_num, line_num, event.symbol)\n", "\n", " # change namespace back\n", " shell.Completer.namespace = old_ns\n", "\n", " # get suggestions\n", " suggestions = [event.command + x.name for x in completions]\n", "\n", " # should be able to see these in the terminal for debugging\n", " with open('/dev/stdout', 'w') as f:\n", " print(suggestions, file = f)\n", " \n", " return suggestions\n", "\n", "shell = get_ipython()\n", "shell.set_hook('complete_command', hook, re_key = '.*zzz.*')" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "# uncomment and press tab\n", "#zzz." ] }, { "attachments": { "992be80a-48f7-4e99-9e48-a8b7852c6a7f.png": { "image/png": "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" } }, "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "![image.png](attachment:992be80a-48f7-4e99-9e48-a8b7852c6a7f.png)\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Option 2: monkey patching siuba.siu.Symbolic\n", "\n", "Finally, you could imagine that we replace some part of the Symbolic class, so that it does the autocomplete. This is shown below (using a new class rather than monkey patching)." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "from siuba.siu import Symbolic\n", "from siuba.data import mtcars\n", "\n", "class Symbolic2(Symbolic):\n", " def __dir__(self):\n", " return dir(mtcars)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "However, a problem here is that when Jedi completes on a DataFrame (vs something with a `__dir__` method that spits out DataFrame info), it can add type information. With the `__dir__` method, Jedi does not know we want it to think of Symbolic2 as a DataFrame." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('abs', 'instance')" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bbb = Symbolic2()\n", "\n", "from siuba import _\n", "import jedi\n", "interpreter = jedi.Interpreter('bbb.', [{'bbb': bbb, 'mtcars': mtcars}])\n", "\n", "completions = list(interpreter.complete())\n", "\n", "entry = completions[0]\n", "entry.name, entry.type" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is why in the output above it doesn't know that `abs` is a function, so reports it as an instance." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Option 3: monkey patching `IPython.Completer._jedi_matches`\n", "\n", "This approach is similar to the above, where we replace `_` in the Completer's namespace with the target DataFrame. However, we do the replacement by manually copying the code of the `_jedi_matches` method, and making the replacement at the very beginning.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Alternatively, you could just wrap _jedi_matches to change `shell.Completer.namespace` as in the hook example." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "import types\n", "\n", "from functools import wraps\n", "from siuba.data import mtcars\n", "from siuba import _\n", "\n", "# using aaa for this example\n", "aaa = _\n", "\n", "def _jedi_matches_wrapper(obj):\n", " f = obj._jedi_matches\n", " @wraps(f)\n", " def wrapper(self, *args, **kwargs):\n", " # store old namespace (should be context manager)\n", " old_ns = self.namespace\n", " \n", " target_df = self.namespace[\"mtcars\"]\n", " self.namespace = {**old_ns, \"aaa\": target_df}\n", " \n", " res = f(*args, **kwargs)\n", " \n", " # set namespace back\n", " self.namespace = old_ns\n", " \n", " # return results\n", " return res\n", " \n", " return types.MethodType(wrapper, obj)\n", "\n", "#shell = get_ipython()\n", "#shell.Completer._jedi_matches = _jedi_matches_wrapper(shell.Completer)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[,\n", " ,\n", " ]" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.core.completer import IPCompleter, provisionalcompleter\n", "\n", "shell = get_ipython()\n", "completer = IPCompleter(shell, shell.user_ns)\n", "\n", "completer._jedi_matches = _jedi_matches_wrapper(shell.Completer)\n", "\n", "with provisionalcompleter():\n", " completions = list(completer.completions('aaa.', 4))\n", "\n", "completions[:3]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Alternatively, you could manually copy the `_jedi_matches` function, and modify it to pass the edited namespace instead.\n", "\n", "```python\n", "def _jedi_matches(self, cursor_column:int, cursor_line:int, text:str) -> Iterable[Any]:\n", " # THIS CONTENT IS INSERTED ----\n", " # do namespace stuff...\n", " \n", " # THIS CONTENT ORIGINAL ----\n", " # do original stuff in function\n", "\n", "shell = get_ipython()\n", "if shell is not None:\n", " shell.Completer._jedi_matches = functools.partial(_jedi_matches, shell.Completer)\n", "\n", "```\n", "\n", "This has the advantage of not changing state on the Completer, but essentially locks us into using whatever `_jedi_matches` was when we copied it." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Summary\n", "\n", "Autocomplete for `_` that returns info about a DataFrame, requires two things.\n", "\n", "1. Identifying what DataFrame the user has in mind\n", "2. Implementing code around IPython's IPCompleter class.\n", "\n", "For identifying the right DataFrame, we can use static analysis over a user's code history, along with python's built-in `ast` package.\n", "\n", "For implementing the autocomplete itself, our best bet for now is to wrap `IPCompleter._jedi_matches`. In the long run it's worth opening an issue on IPython to discuss how we could get the colored type annotations without this kind of patch, or whether they know of better options!" ] } ], "metadata": { "kernelspec": { "display_name": "venv-siuba", "language": "python", "name": "venv-siuba" }, "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.8" } }, "nbformat": 4, "nbformat_minor": 4 }