Repository: amogorkon/justuse (language: python)

Issue:
class and function definitions should be checked on reload - if names or signatures do not match previous definitions, warn() the user



Discussion / hints:

Fix patch:
diff --git a/docs/Showcase.ipynb b/docs/Showcase.ipynb
index 318febeb..c914c60c 100644
--- a/docs/Showcase.ipynb
+++ b/docs/Showcase.ipynb
@@ -20,11 +20,11 @@
    "execution_count": 1,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:08:31.782554Z",
-     "iopub.status.busy": "2022-03-29T17:08:31.781962Z",
-     "iopub.status.idle": "2022-03-29T17:08:37.098058Z",
-     "shell.execute_reply": "2022-03-29T17:08:37.097245Z",
-     "shell.execute_reply.started": "2022-03-29T17:08:31.782412Z"
+     "iopub.execute_input": "2022-04-19T20:29:31.388658Z",
+     "iopub.status.busy": "2022-04-19T20:29:31.387818Z",
+     "iopub.status.idle": "2022-04-19T20:29:40.993719Z",
+     "shell.execute_reply": "2022-04-19T20:29:40.991904Z",
+     "shell.execute_reply.started": "2022-04-19T20:29:31.388449Z"
     },
     "tags": []
    },
@@ -33,27 +33,36 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Requirement already satisfied: justuse in /home/thorsten/anaconda3/lib/python3.8/site-packages (0.7.5)\n",
+      "Collecting justuse\n",
+      "  Downloading justuse-0.7.8.tar.gz (189 kB)\n",
       "Requirement already satisfied: beartype>=0.8.1 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (0.9.1)\n",
-      "Requirement already satisfied: icontract>=2.5.4 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (2.5.5)\n",
       "Requirement already satisfied: furl>=2.1.2 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (2.1.2)\n",
-      "Requirement already satisfied: pydantic>=1.8.2 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (1.8.2)\n",
+      "Requirement already satisfied: icontract>=2.5.4 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (2.5.5)\n",
       "Requirement already satisfied: jinja2 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (2.11.3)\n",
-      "Requirement already satisfied: wheel in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (0.37.0)\n",
-      "Requirement already satisfied: toml in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (0.10.2)\n",
       "Requirement already satisfied: packaging==21.0 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (21.0)\n",
       "Requirement already satisfied: pip in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (21.3.1)\n",
+      "Requirement already satisfied: pydantic>=1.8.2 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (1.8.2)\n",
       "Requirement already satisfied: requests in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (2.26.0)\n",
+      "Requirement already satisfied: toml in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (0.10.2)\n",
+      "Requirement already satisfied: wheel in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (0.37.0)\n",
       "Requirement already satisfied: pyparsing>=2.0.2 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from packaging==21.0->justuse) (3.0.4)\n",
       "Requirement already satisfied: orderedmultidict>=1.0.1 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from furl>=2.1.2->justuse) (1.0.1)\n",
       "Requirement already satisfied: six>=1.8.0 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from furl>=2.1.2->justuse) (1.16.0)\n",
       "Requirement already satisfied: asttokens<3,>=2 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from icontract>=2.5.4->justuse) (2.0.5)\n",
       "Requirement already satisfied: typing-extensions in /home/thorsten/anaconda3/lib/python3.8/site-packages (from icontract>=2.5.4->justuse) (3.10.0.2)\n",
       "Requirement already satisfied: MarkupSafe>=0.23 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from jinja2->justuse) (1.1.1)\n",
-      "Requirement already satisfied: certifi>=2017.4.17 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from requests->justuse) (2021.10.8)\n",
       "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from requests->justuse) (1.26.7)\n",
+      "Requirement already satisfied: certifi>=2017.4.17 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from requests->justuse) (2021.10.8)\n",
       "Requirement already satisfied: idna<4,>=2.5 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from requests->justuse) (3.2)\n",
-      "Requirement already satisfied: charset-normalizer~=2.0.0 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from requests->justuse) (2.0.4)\n"
+      "Requirement already satisfied: charset-normalizer~=2.0.0 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from requests->justuse) (2.0.4)\n",
+      "Building wheels for collected packages: justuse\n",
+      "  Building wheel for justuse (setup.py): started\n",
+      "  Building wheel for justuse (setup.py): finished with status 'done'\n",
+      "  Created wheel for justuse: filename=justuse-0.7.8-py3-none-any.whl size=146820 sha256=9737ab2bd47c1c3a053f314a10b32ecaa0dc7c2c6d85cfe6c60ee35f202103cb\n",
+      "  Stored in directory: /home/thorsten/.cache/pip/wheels/b2/d6/b0/bd686b06c4c3483cf0683d116d96607802e9ea987521875a12\n",
+      "Successfully built justuse\n",
+      "Installing collected packages: justuse\n",
+      "Successfully installed justuse-0.7.8\n"
      ]
     },
     {
@@ -75,11 +84,11 @@
    "execution_count": 2,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:08:37.099787Z",
-     "iopub.status.busy": "2022-03-29T17:08:37.099429Z",
-     "iopub.status.idle": "2022-03-29T17:08:38.078322Z",
-     "shell.execute_reply": "2022-03-29T17:08:38.075868Z",
-     "shell.execute_reply.started": "2022-03-29T17:08:37.099752Z"
+     "iopub.execute_input": "2022-04-19T20:29:40.996180Z",
+     "iopub.status.busy": "2022-04-19T20:29:40.995753Z",
+     "iopub.status.idle": "2022-04-19T20:29:41.987507Z",
+     "shell.execute_reply": "2022-04-19T20:29:41.986388Z",
+     "shell.execute_reply.started": "2022-04-19T20:29:40.996141Z"
     },
     "tags": []
    },
@@ -93,21 +102,24 @@
    "execution_count": 3,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:08:38.086978Z",
-     "iopub.status.busy": "2022-03-29T17:08:38.086122Z",
-     "iopub.status.idle": "2022-03-29T17:08:38.122451Z",
-     "shell.execute_reply": "2022-03-29T17:08:38.121332Z",
-     "shell.execute_reply.started": "2022-03-29T17:08:38.086872Z"
+     "iopub.execute_input": "2022-04-19T20:29:41.992001Z",
+     "iopub.status.busy": "2022-04-19T20:29:41.991621Z",
+     "iopub.status.idle": "2022-04-19T20:29:42.015574Z",
+     "shell.execute_reply": "2022-04-19T20:29:42.014323Z",
+     "shell.execute_reply.started": "2022-04-19T20:29:41.991951Z"
     },
     "tags": []
    },
    "outputs": [
     {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "0.7.5\n"
-     ]
+     "data": {
+      "text/plain": [
+       "'0.7.8'"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
     }
    ],
    "source": [
@@ -141,11 +153,11 @@
    "execution_count": 4,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:08:38.124889Z",
-     "iopub.status.busy": "2022-03-29T17:08:38.124471Z",
-     "iopub.status.idle": "2022-03-29T17:08:38.389503Z",
-     "shell.execute_reply": "2022-03-29T17:08:38.387990Z",
-     "shell.execute_reply.started": "2022-03-29T17:08:38.124844Z"
+     "iopub.execute_input": "2022-04-19T20:29:42.019693Z",
+     "iopub.status.busy": "2022-04-19T20:29:42.018101Z",
+     "iopub.status.idle": "2022-04-19T20:29:42.052447Z",
+     "shell.execute_reply": "2022-04-19T20:29:42.051425Z",
+     "shell.execute_reply.started": "2022-04-19T20:29:42.019219Z"
     },
     "tags": []
    },
@@ -207,11 +219,11 @@
    "execution_count": 5,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:08:38.391816Z",
-     "iopub.status.busy": "2022-03-29T17:08:38.391418Z",
-     "iopub.status.idle": "2022-03-29T17:08:38.401440Z",
-     "shell.execute_reply": "2022-03-29T17:08:38.399907Z",
-     "shell.execute_reply.started": "2022-03-29T17:08:38.391768Z"
+     "iopub.execute_input": "2022-04-19T20:29:42.056358Z",
+     "iopub.status.busy": "2022-04-19T20:29:42.055731Z",
+     "iopub.status.idle": "2022-04-19T20:29:42.064470Z",
+     "shell.execute_reply": "2022-04-19T20:29:42.062970Z",
+     "shell.execute_reply.started": "2022-04-19T20:29:42.056309Z"
     },
     "tags": []
    },
@@ -255,11 +267,11 @@
    "execution_count": 6,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:08:38.404522Z",
-     "iopub.status.busy": "2022-03-29T17:08:38.403910Z",
-     "iopub.status.idle": "2022-03-29T17:08:38.463275Z",
-     "shell.execute_reply": "2022-03-29T17:08:38.461173Z",
-     "shell.execute_reply.started": "2022-03-29T17:08:38.404444Z"
+     "iopub.execute_input": "2022-04-19T20:29:42.067273Z",
+     "iopub.status.busy": "2022-04-19T20:29:42.066869Z",
+     "iopub.status.idle": "2022-04-19T20:29:42.100134Z",
+     "shell.execute_reply": "2022-04-19T20:29:42.092464Z",
+     "shell.execute_reply.started": "2022-04-19T20:29:42.067234Z"
     },
     "tags": []
    },
@@ -306,11 +318,11 @@
    "execution_count": 7,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:08:38.465395Z",
-     "iopub.status.busy": "2022-03-29T17:08:38.464921Z",
-     "iopub.status.idle": "2022-03-29T17:08:38.840734Z",
-     "shell.execute_reply": "2022-03-29T17:08:38.839824Z",
-     "shell.execute_reply.started": "2022-03-29T17:08:38.465313Z"
+     "iopub.execute_input": "2022-04-19T20:29:42.102461Z",
+     "iopub.status.busy": "2022-04-19T20:29:42.102020Z",
+     "iopub.status.idle": "2022-04-19T20:29:43.009822Z",
+     "shell.execute_reply": "2022-04-19T20:29:43.008453Z",
+     "shell.execute_reply.started": "2022-04-19T20:29:42.102410Z"
     },
     "tags": []
    },
@@ -360,11 +372,11 @@
    "execution_count": 8,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:08:38.842445Z",
-     "iopub.status.busy": "2022-03-29T17:08:38.842158Z",
-     "iopub.status.idle": "2022-03-29T17:08:39.049843Z",
-     "shell.execute_reply": "2022-03-29T17:08:39.048869Z",
-     "shell.execute_reply.started": "2022-03-29T17:08:38.842411Z"
+     "iopub.execute_input": "2022-04-19T20:29:43.012118Z",
+     "iopub.status.busy": "2022-04-19T20:29:43.011694Z",
+     "iopub.status.idle": "2022-04-19T20:29:43.224682Z",
+     "shell.execute_reply": "2022-04-19T20:29:43.223774Z",
+     "shell.execute_reply.started": "2022-04-19T20:29:43.012080Z"
     },
     "tags": []
    },
@@ -374,7 +386,7 @@
      "output_type": "stream",
      "text": [
       "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.main\u001b[1;30m: \u001b[0mcase = (True, False, True, False)\n",
-      "/home/thorsten/anaconda3/lib/python3.8/site-packages/use/pimp.py:87: VersionWarning: numpy expected to be version 2022, but got 1.21.2 instead\n",
+      "/home/thorsten/anaconda3/lib/python3.8/site-packages/use/pimp.py:84: VersionWarning: numpy expected to be version 2022, but got 1.21.2 instead\n",
       "  warn(UserMessage.version_warning(name, version, result_version), category=VersionWarning)\n",
       "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.buffet_old\u001b[1;30m: \u001b[0mresult = <module 'numpy' from '/home/thorsten/anaconda3/lib/python3.8/site-packages/numpy/__init__.py'>\n"
      ]
@@ -389,11 +401,11 @@
    "execution_count": 9,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:08:39.051461Z",
-     "iopub.status.busy": "2022-03-29T17:08:39.051169Z",
-     "iopub.status.idle": "2022-03-29T17:08:39.064756Z",
-     "shell.execute_reply": "2022-03-29T17:08:39.063369Z",
-     "shell.execute_reply.started": "2022-03-29T17:08:39.051427Z"
+     "iopub.execute_input": "2022-04-19T20:29:43.226011Z",
+     "iopub.status.busy": "2022-04-19T20:29:43.225663Z",
+     "iopub.status.idle": "2022-04-19T20:29:43.240716Z",
+     "shell.execute_reply": "2022-04-19T20:29:43.238781Z",
+     "shell.execute_reply.started": "2022-04-19T20:29:43.225976Z"
     },
     "tags": []
    },
@@ -432,11 +444,11 @@
    "execution_count": 10,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:08:39.066211Z",
-     "iopub.status.busy": "2022-03-29T17:08:39.065926Z",
-     "iopub.status.idle": "2022-03-29T17:08:39.149730Z",
-     "shell.execute_reply": "2022-03-29T17:08:39.146239Z",
-     "shell.execute_reply.started": "2022-03-29T17:08:39.066177Z"
+     "iopub.execute_input": "2022-04-19T20:29:43.242883Z",
+     "iopub.status.busy": "2022-04-19T20:29:43.242339Z",
+     "iopub.status.idle": "2022-04-19T20:29:43.583167Z",
+     "shell.execute_reply": "2022-04-19T20:29:43.579574Z",
+     "shell.execute_reply.started": "2022-04-19T20:29:43.242775Z"
     },
     "tags": []
    },
@@ -456,13 +468,13 @@
      "traceback": [
       "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
       "\u001b[0;31mImportError\u001b[0m                               Traceback (most recent call last)",
-      "\u001b[0;32m/tmp/ipykernel_3329/217604034.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mpg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0muse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"pygame\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m    128\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    129\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__condition\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 130\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__implementation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    131\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    132\u001b[0m     \u001b[0;31m# to allow `numpy @ use` for a quick check\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m/tmp/ipykernel_2447/217604034.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mpg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0muse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"pygame\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m    133\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    134\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__condition\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 135\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__implementation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    136\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    137\u001b[0m     \u001b[0;31m# to allow `numpy @ use` for a quick check\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
       "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/tools.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m     44\u001b[0m                 \u001b[0;32mraise\u001b[0m \u001b[0mNirvanaWarning\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"No use trying to use Nothing.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     45\u001b[0m             \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 46\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mdispatcher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdispatch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     47\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     48\u001b[0m     \u001b[0mwrapper\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregister\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdispatcher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregister\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_str\u001b[0;34m(self, name, version, hash_algo, hashes, default, modes)\u001b[0m\n\u001b[1;32m    723\u001b[0m         \"\"\"\n\u001b[1;32m    724\u001b[0m         \u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodule_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_parse_name\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 725\u001b[0;31m         return self._use_package(\n\u001b[0m\u001b[1;32m    726\u001b[0m             \u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    727\u001b[0m             \u001b[0mpackage_name\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_str\u001b[0;34m(self, name, version, hash_algo, hashes, default, modes)\u001b[0m\n\u001b[1;32m    667\u001b[0m         \"\"\"\n\u001b[1;32m    668\u001b[0m         \u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodule_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_parse_name\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 669\u001b[0;31m         return self._use_package(\n\u001b[0m\u001b[1;32m    670\u001b[0m             \u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    671\u001b[0m             \u001b[0mpackage_name\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
       "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/icontract/_checkers.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    639\u001b[0m                 \u001b[0;31m# Unfortunately, this can not be done in Python 3, see\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    640\u001b[0m                 \u001b[0;31m# https://stackoverflow.com/questions/44813333/how-can-i-elide-a-function-wrapper-from-the-traceback-in-python-3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 641\u001b[0;31m                 \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    642\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    643\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0mpostconditions\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_package\u001b[0;34m(self, name, package_name, module_name, version, hashes, default, hash_algo, modes, Message)\u001b[0m\n\u001b[1;32m    807\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    808\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 809\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0m_fail_or_default\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    810\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    811\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mModuleType\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/pimp.py\u001b[0m in \u001b[0;36m_fail_or_default\u001b[0;34m(exception, default)\u001b[0m\n\u001b[1;32m    955\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    956\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 957\u001b[0;31m         \u001b[0;32mraise\u001b[0m \u001b[0mexception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    958\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    959\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_package\u001b[0;34m(self, name, package_name, module_name, version, hashes, default, hash_algo, modes, Message)\u001b[0m\n\u001b[1;32m    751\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    752\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 753\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0m_fail_or_default\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    754\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    755\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mModuleType\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/pimp.py\u001b[0m in \u001b[0;36m_fail_or_default\u001b[0;34m(exception, default)\u001b[0m\n\u001b[1;32m    943\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    944\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 945\u001b[0;31m         \u001b[0;32mraise\u001b[0m \u001b[0mexception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    946\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    947\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
       "\u001b[0;31mImportError\u001b[0m: No pkg installed named pygame and auto-installation not requested. Aborting."
      ]
     }
@@ -483,11 +495,11 @@
    "execution_count": 11,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:08:47.932063Z",
-     "iopub.status.busy": "2022-03-29T17:08:47.931709Z",
-     "iopub.status.idle": "2022-03-29T17:08:50.952098Z",
-     "shell.execute_reply": "2022-03-29T17:08:50.950268Z",
-     "shell.execute_reply.started": "2022-03-29T17:08:47.932025Z"
+     "iopub.execute_input": "2022-04-19T20:29:57.119115Z",
+     "iopub.status.busy": "2022-04-19T20:29:57.118240Z",
+     "iopub.status.idle": "2022-04-19T20:30:01.695768Z",
+     "shell.execute_reply": "2022-04-19T20:30:01.693875Z",
+     "shell.execute_reply.started": "2022-04-19T20:29:57.119082Z"
     },
     "tags": []
    },
@@ -520,13 +532,13 @@
      "traceback": [
       "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
       "\u001b[0;31mRuntimeWarning\u001b[0m                            Traceback (most recent call last)",
-      "\u001b[0;32m/tmp/ipykernel_3329/1145780527.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mpg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0muse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"pygame\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodes\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0muse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mauto_install\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m    128\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    129\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__condition\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 130\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__implementation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    131\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    132\u001b[0m     \u001b[0;31m# to allow `numpy @ use` for a quick check\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m/tmp/ipykernel_2447/1145780527.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mpg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0muse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"pygame\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodes\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0muse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mauto_install\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m    133\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    134\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__condition\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 135\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__implementation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    136\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    137\u001b[0m     \u001b[0;31m# to allow `numpy @ use` for a quick check\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
       "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/tools.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m     44\u001b[0m                 \u001b[0;32mraise\u001b[0m \u001b[0mNirvanaWarning\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"No use trying to use Nothing.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     45\u001b[0m             \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 46\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mdispatcher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdispatch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     47\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     48\u001b[0m     \u001b[0mwrapper\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregister\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdispatcher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregister\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_str\u001b[0;34m(self, name, version, hash_algo, hashes, default, modes)\u001b[0m\n\u001b[1;32m    723\u001b[0m         \"\"\"\n\u001b[1;32m    724\u001b[0m         \u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodule_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_parse_name\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 725\u001b[0;31m         return self._use_package(\n\u001b[0m\u001b[1;32m    726\u001b[0m             \u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    727\u001b[0m             \u001b[0mpackage_name\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_str\u001b[0;34m(self, name, version, hash_algo, hashes, default, modes)\u001b[0m\n\u001b[1;32m    667\u001b[0m         \"\"\"\n\u001b[1;32m    668\u001b[0m         \u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodule_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_parse_name\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 669\u001b[0;31m         return self._use_package(\n\u001b[0m\u001b[1;32m    670\u001b[0m             \u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    671\u001b[0m             \u001b[0mpackage_name\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
       "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/icontract/_checkers.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    639\u001b[0m                 \u001b[0;31m# Unfortunately, this can not be done in Python 3, see\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    640\u001b[0m                 \u001b[0;31m# https://stackoverflow.com/questions/44813333/how-can-i-elide-a-function-wrapper-from-the-traceback-in-python-3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 641\u001b[0;31m                 \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    642\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    643\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0mpostconditions\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_package\u001b[0;34m(self, name, package_name, module_name, version, hashes, default, hash_algo, modes, Message)\u001b[0m\n\u001b[1;32m    807\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    808\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 809\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0m_fail_or_default\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    810\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    811\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mModuleType\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/pimp.py\u001b[0m in \u001b[0;36m_fail_or_default\u001b[0;34m(exception, default)\u001b[0m\n\u001b[1;32m    955\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    956\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 957\u001b[0;31m         \u001b[0;32mraise\u001b[0m \u001b[0mexception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    958\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    959\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_package\u001b[0;34m(self, name, package_name, module_name, version, hashes, default, hash_algo, modes, Message)\u001b[0m\n\u001b[1;32m    751\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    752\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 753\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0m_fail_or_default\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    754\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    755\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mModuleType\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/pimp.py\u001b[0m in \u001b[0;36m_fail_or_default\u001b[0;34m(exception, default)\u001b[0m\n\u001b[1;32m    943\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    944\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 945\u001b[0;31m         \u001b[0;32mraise\u001b[0m \u001b[0mexception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    946\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    947\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
       "\u001b[0;31mRuntimeWarning\u001b[0m: Please specify version and hash for auto-installation of 'pygame'.\nA webbrowser should open to the Snyk Advisor to check whether the package is vulnerable or malicious.\nIf you want to auto-install the latest version, try the following line to select all viable hashes:\nuse(\"pygame\", version=\"2.1.3.dev4\", modes=use.auto_install)"
      ]
     }
@@ -554,11 +566,11 @@
    "execution_count": 12,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:08:59.641601Z",
-     "iopub.status.busy": "2022-03-29T17:08:59.640706Z",
-     "iopub.status.idle": "2022-03-29T17:08:59.649621Z",
-     "shell.execute_reply": "2022-03-29T17:08:59.648519Z",
-     "shell.execute_reply.started": "2022-03-29T17:08:59.641556Z"
+     "iopub.execute_input": "2022-04-19T20:30:06.458357Z",
+     "iopub.status.busy": "2022-04-19T20:30:06.457372Z",
+     "iopub.status.idle": "2022-04-19T20:30:06.466495Z",
+     "shell.execute_reply": "2022-04-19T20:30:06.465465Z",
+     "shell.execute_reply.started": "2022-04-19T20:30:06.458306Z"
     },
     "tags": []
    },
@@ -567,7 +579,7 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Linux 5.4.0-105-generic \n",
+      "Linux 5.4.0-107-generic \n",
       " 3.8.5\n"
      ]
     }
@@ -581,11 +593,11 @@
    "execution_count": 13,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:09:00.912046Z",
-     "iopub.status.busy": "2022-03-29T17:09:00.911204Z",
-     "iopub.status.idle": "2022-03-29T17:09:02.311836Z",
-     "shell.execute_reply": "2022-03-29T17:09:02.308668Z",
-     "shell.execute_reply.started": "2022-03-29T17:09:00.912003Z"
+     "iopub.execute_input": "2022-04-19T20:30:06.649889Z",
+     "iopub.status.busy": "2022-04-19T20:30:06.648822Z",
+     "iopub.status.idle": "2022-04-19T20:30:08.090142Z",
+     "shell.execute_reply": "2022-04-19T20:30:08.088227Z",
+     "shell.execute_reply.started": "2022-04-19T20:30:06.649856Z"
     },
     "tags": []
    },
@@ -612,13 +624,13 @@
      "traceback": [
       "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
       "\u001b[0;31mRuntimeWarning\u001b[0m                            Traceback (most recent call last)",
-      "\u001b[0;32m/tmp/ipykernel_3329/1367005035.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0muse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"pygame\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mversion\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"2.1.2\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodes\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0muse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mauto_install\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m    128\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    129\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__condition\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 130\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__implementation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    131\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    132\u001b[0m     \u001b[0;31m# to allow `numpy @ use` for a quick check\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m/tmp/ipykernel_2447/1367005035.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0muse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"pygame\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mversion\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"2.1.2\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodes\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0muse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mauto_install\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m    133\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    134\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__condition\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 135\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__implementation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    136\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    137\u001b[0m     \u001b[0;31m# to allow `numpy @ use` for a quick check\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
       "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/tools.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m     44\u001b[0m                 \u001b[0;32mraise\u001b[0m \u001b[0mNirvanaWarning\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"No use trying to use Nothing.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     45\u001b[0m             \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 46\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mdispatcher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdispatch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     47\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     48\u001b[0m     \u001b[0mwrapper\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregister\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdispatcher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregister\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_str\u001b[0;34m(self, name, version, hash_algo, hashes, default, modes)\u001b[0m\n\u001b[1;32m    723\u001b[0m         \"\"\"\n\u001b[1;32m    724\u001b[0m         \u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodule_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_parse_name\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 725\u001b[0;31m         return self._use_package(\n\u001b[0m\u001b[1;32m    726\u001b[0m             \u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    727\u001b[0m             \u001b[0mpackage_name\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_str\u001b[0;34m(self, name, version, hash_algo, hashes, default, modes)\u001b[0m\n\u001b[1;32m    667\u001b[0m         \"\"\"\n\u001b[1;32m    668\u001b[0m         \u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodule_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_parse_name\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 669\u001b[0;31m         return self._use_package(\n\u001b[0m\u001b[1;32m    670\u001b[0m             \u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    671\u001b[0m             \u001b[0mpackage_name\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
       "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/icontract/_checkers.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    639\u001b[0m                 \u001b[0;31m# Unfortunately, this can not be done in Python 3, see\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    640\u001b[0m                 \u001b[0;31m# https://stackoverflow.com/questions/44813333/how-can-i-elide-a-function-wrapper-from-the-traceback-in-python-3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 641\u001b[0;31m                 \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    642\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    643\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0mpostconditions\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_package\u001b[0;34m(self, name, package_name, module_name, version, hashes, default, hash_algo, modes, Message)\u001b[0m\n\u001b[1;32m    807\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    808\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 809\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0m_fail_or_default\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    810\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    811\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mModuleType\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/pimp.py\u001b[0m in \u001b[0;36m_fail_or_default\u001b[0;34m(exception, default)\u001b[0m\n\u001b[1;32m    955\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    956\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 957\u001b[0;31m         \u001b[0;32mraise\u001b[0m \u001b[0mexception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    958\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    959\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_package\u001b[0;34m(self, name, package_name, module_name, version, hashes, default, hash_algo, modes, Message)\u001b[0m\n\u001b[1;32m    751\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    752\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 753\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0m_fail_or_default\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    754\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    755\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mModuleType\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/pimp.py\u001b[0m in \u001b[0;36m_fail_or_default\u001b[0;34m(exception, default)\u001b[0m\n\u001b[1;32m    943\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    944\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 945\u001b[0;31m         \u001b[0;32mraise\u001b[0m \u001b[0mexception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    946\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    947\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
       "\u001b[0;31mRuntimeWarning\u001b[0m: Failed to auto-install 'pygame' because hashes aren't specified.\n        A webbrowser should open with a list of available hashes for different platforms for you to pick.\"\n        If you want to use the package only on this platform, this should work:\n    use(\"pygame\", version=\"2.1.2\", hashes='V蘕驈詋光釠軫鳌铎縵䁄鉠龔嵚匟䍶癦㣠', modes=use.auto_install)"
      ]
     }
@@ -661,11 +673,11 @@
    "execution_count": 14,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:09:10.739111Z",
-     "iopub.status.busy": "2022-03-29T17:09:10.738727Z",
-     "iopub.status.idle": "2022-03-29T17:09:27.819663Z",
-     "shell.execute_reply": "2022-03-29T17:09:27.818176Z",
-     "shell.execute_reply.started": "2022-03-29T17:09:10.739072Z"
+     "iopub.execute_input": "2022-04-19T20:30:14.509533Z",
+     "iopub.status.busy": "2022-04-19T20:30:14.508629Z",
+     "iopub.status.idle": "2022-04-19T20:30:14.672020Z",
+     "shell.execute_reply": "2022-04-19T20:30:14.670783Z",
+     "shell.execute_reply.started": "2022-04-19T20:30:14.509485Z"
     },
     "tags": []
    },
@@ -675,54 +687,6 @@
      "output_type": "stream",
      "text": [
       "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.main\u001b[1;30m: \u001b[0mcase = (True, True, False, True)\n",
-      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mAttempting auto-installation of <1219a963941bd53aa754e8449364c142004fe706c33a9c22ff2a76521a82d078>...\n",
-      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mDownloading artifact from PyPI...\n",
-      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mDownload successful.\n",
-      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mAttempting to install..\n"
-     ]
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Using pip 21.2.4 from /home/thorsten/anaconda3/lib/python3.8/site-packages/pip (python 3.8)\n",
-      "Non-user install due to --prefix or --target option\n",
-      "Created temporary directory: /tmp/pip-ephem-wheel-cache-2jr7tl_n\n",
-      "Created temporary directory: /tmp/pip-req-tracker-1n7fx1dn\n",
-      "Initialized build tracking at /tmp/pip-req-tracker-1n7fx1dn\n",
-      "Created build tracker: /tmp/pip-req-tracker-1n7fx1dn\n",
-      "Entered build tracker: /tmp/pip-req-tracker-1n7fx1dn\n",
-      "Created temporary directory: /tmp/pip-install-x1k3385k\n",
-      "Processing /home/thorsten/.justuse-python/packages/pygame-2.1.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl\n",
-      "  Added pygame==2.1.2 from file:///home/thorsten/.justuse-python/packages/pygame-2.1.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl to build tracker '/tmp/pip-req-tracker-1n7fx1dn'\n",
-      "  Removed pygame==2.1.2 from file:///home/thorsten/.justuse-python/packages/pygame-2.1.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl from build tracker '/tmp/pip-req-tracker-1n7fx1dn'\n",
-      "Created temporary directory: /tmp/pip-unpack-na9sd2b7\n",
-      "Installing collected packages: pygame\n"
-     ]
-    },
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mInstallation successful.\n"
-     ]
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "\n",
-      "Successfully installed pygame-2.1.2\n",
-      "Removed build tracker: '/tmp/pip-req-tracker-1n7fx1dn'\n"
-     ]
-    },
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mdist=<importlib_metadata.PathDistribution object at 0x7f53729300a0>\n",
-      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mAttempting to import...\n",
-      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mSuccessfully imported.\n",
       "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.buffet_old\u001b[1;30m: \u001b[0mresult = <module 'pygame' from '/home/thorsten/.justuse-python/venv/pygame/2.1.2/lib/python3.8/site-packages/pygame/__init__.py'>\n"
      ]
     },
@@ -811,11 +775,11 @@
    "execution_count": 15,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:09:37.523441Z",
-     "iopub.status.busy": "2022-03-29T17:09:37.523070Z",
-     "iopub.status.idle": "2022-03-29T17:09:37.537150Z",
-     "shell.execute_reply": "2022-03-29T17:09:37.536156Z",
-     "shell.execute_reply.started": "2022-03-29T17:09:37.523398Z"
+     "iopub.execute_input": "2022-04-19T20:30:49.675161Z",
+     "iopub.status.busy": "2022-04-19T20:30:49.673448Z",
+     "iopub.status.idle": "2022-04-19T20:30:49.687338Z",
+     "shell.execute_reply": "2022-04-19T20:30:49.686215Z",
+     "shell.execute_reply.started": "2022-04-19T20:30:49.675083Z"
     },
     "tags": []
    },
@@ -844,11 +808,11 @@
    "execution_count": 16,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:09:39.008242Z",
-     "iopub.status.busy": "2022-03-29T17:09:39.007877Z",
-     "iopub.status.idle": "2022-03-29T17:09:39.022433Z",
-     "shell.execute_reply": "2022-03-29T17:09:39.021387Z",
-     "shell.execute_reply.started": "2022-03-29T17:09:39.008204Z"
+     "iopub.execute_input": "2022-04-19T20:30:51.110548Z",
+     "iopub.status.busy": "2022-04-19T20:30:51.110177Z",
+     "iopub.status.idle": "2022-04-19T20:30:51.119782Z",
+     "shell.execute_reply": "2022-04-19T20:30:51.118875Z",
+     "shell.execute_reply.started": "2022-04-19T20:30:51.110508Z"
     },
     "tags": []
    },
@@ -870,11 +834,11 @@
    "execution_count": 17,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:09:40.235932Z",
-     "iopub.status.busy": "2022-03-29T17:09:40.235520Z",
-     "iopub.status.idle": "2022-03-29T17:09:40.241824Z",
-     "shell.execute_reply": "2022-03-29T17:09:40.240800Z",
-     "shell.execute_reply.started": "2022-03-29T17:09:40.235896Z"
+     "iopub.execute_input": "2022-04-19T20:30:51.589542Z",
+     "iopub.status.busy": "2022-04-19T20:30:51.589202Z",
+     "iopub.status.idle": "2022-04-19T20:30:51.595387Z",
+     "shell.execute_reply": "2022-04-19T20:30:51.593840Z",
+     "shell.execute_reply.started": "2022-04-19T20:30:51.589506Z"
     },
     "tags": []
    },
@@ -903,11 +867,11 @@
    "execution_count": 18,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:09:42.934273Z",
-     "iopub.status.busy": "2022-03-29T17:09:42.933820Z",
-     "iopub.status.idle": "2022-03-29T17:09:42.959816Z",
-     "shell.execute_reply": "2022-03-29T17:09:42.958503Z",
-     "shell.execute_reply.started": "2022-03-29T17:09:42.934219Z"
+     "iopub.execute_input": "2022-04-19T20:30:55.302197Z",
+     "iopub.status.busy": "2022-04-19T20:30:55.301833Z",
+     "iopub.status.idle": "2022-04-19T20:30:55.311903Z",
+     "shell.execute_reply": "2022-04-19T20:30:55.310900Z",
+     "shell.execute_reply.started": "2022-04-19T20:30:55.302159Z"
     },
     "tags": []
    },
@@ -952,11 +916,11 @@
    "execution_count": 19,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:09:44.362039Z",
-     "iopub.status.busy": "2022-03-29T17:09:44.361536Z",
-     "iopub.status.idle": "2022-03-29T17:09:44.692046Z",
-     "shell.execute_reply": "2022-03-29T17:09:44.690576Z",
-     "shell.execute_reply.started": "2022-03-29T17:09:44.361996Z"
+     "iopub.execute_input": "2022-04-19T20:31:00.853780Z",
+     "iopub.status.busy": "2022-04-19T20:31:00.853388Z",
+     "iopub.status.idle": "2022-04-19T20:31:01.126170Z",
+     "shell.execute_reply": "2022-04-19T20:31:01.125400Z",
+     "shell.execute_reply.started": "2022-04-19T20:31:00.853736Z"
     },
     "tags": []
    },
@@ -965,7 +929,7 @@
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "/home/thorsten/anaconda3/lib/python3.8/site-packages/use/main.py:399: NoValidationWarning: Attempting to import from the interwebs with no validation whatsoever!\n",
+      "/home/thorsten/anaconda3/lib/python3.8/site-packages/use/main.py:414: NoValidationWarning: Attempting to import from the interwebs with no validation whatsoever!\n",
       "To safely reproduce:\n",
       "use(use.URL('https://raw.githubusercontent.com/amogorkon/justuse/unstable/docs/demo.py'), hash_algo=use.Hash.sha256, hash_value='59eff31bb220ce933ccc083b9306020ec25d19d43de30e5ad4341b355d4b48bf')\n",
       "  warn(UserMessage.no_validation(url, hash_algo, this_hash), NoValidationWarning)\n",
@@ -997,11 +961,11 @@
    "execution_count": 20,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:09:49.144653Z",
-     "iopub.status.busy": "2022-03-29T17:09:49.143622Z",
-     "iopub.status.idle": "2022-03-29T17:09:49.226852Z",
-     "shell.execute_reply": "2022-03-29T17:09:49.225797Z",
-     "shell.execute_reply.started": "2022-03-29T17:09:49.144608Z"
+     "iopub.execute_input": "2022-04-19T20:31:02.532609Z",
+     "iopub.status.busy": "2022-04-19T20:31:02.532225Z",
+     "iopub.status.idle": "2022-04-19T20:31:02.624535Z",
+     "shell.execute_reply": "2022-04-19T20:31:02.623682Z",
+     "shell.execute_reply.started": "2022-04-19T20:31:02.532570Z"
     },
     "tags": []
    },
@@ -1023,11 +987,11 @@
    "execution_count": 21,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:09:51.395045Z",
-     "iopub.status.busy": "2022-03-29T17:09:51.394084Z",
-     "iopub.status.idle": "2022-03-29T17:09:51.401257Z",
-     "shell.execute_reply": "2022-03-29T17:09:51.400030Z",
-     "shell.execute_reply.started": "2022-03-29T17:09:51.395015Z"
+     "iopub.execute_input": "2022-04-19T20:31:03.120641Z",
+     "iopub.status.busy": "2022-04-19T20:31:03.119765Z",
+     "iopub.status.idle": "2022-04-19T20:31:03.128720Z",
+     "shell.execute_reply": "2022-04-19T20:31:03.127024Z",
+     "shell.execute_reply.started": "2022-04-19T20:31:03.120584Z"
     },
     "tags": []
    },
@@ -1066,11 +1030,11 @@
    "execution_count": 22,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:09:53.149046Z",
-     "iopub.status.busy": "2022-03-29T17:09:53.147915Z",
-     "iopub.status.idle": "2022-03-29T17:09:53.288414Z",
-     "shell.execute_reply": "2022-03-29T17:09:53.287384Z",
-     "shell.execute_reply.started": "2022-03-29T17:09:53.149003Z"
+     "iopub.execute_input": "2022-04-19T20:31:06.628253Z",
+     "iopub.status.busy": "2022-04-19T20:31:06.627811Z",
+     "iopub.status.idle": "2022-04-19T20:31:06.761001Z",
+     "shell.execute_reply": "2022-04-19T20:31:06.759975Z",
+     "shell.execute_reply.started": "2022-04-19T20:31:06.628214Z"
     },
     "tags": []
    },
@@ -1088,8 +1052,8 @@
       "-rwxrwx--- 1 root    47 Feb 16 11:35  \u001b[01;32mmodule_b.py\u001b[0m*\n",
       "-rwxrwx--- 1 root    62 Feb 16 11:35  \u001b[01;32mmodule_circular_a.py\u001b[0m*\n",
       "-rwxrwx--- 1 root    68 Feb 16 11:35  \u001b[01;32mmodule_circular_b.py\u001b[0m*\n",
-      "drwxrwx--- 1 root     0 Mär 29 18:06  \u001b[01;34m__pycache__\u001b[0m/\n",
-      "-rwxrwx--- 1 root 74015 Mär 29 19:09  \u001b[01;32mShowcase.ipynb\u001b[0m*\n"
+      "drwxrwx--- 1 root  4096 Mär 29 19:09  \u001b[01;34m__pycache__\u001b[0m/\n",
+      "-rwxrwx--- 1 root 70184 Apr 19 22:30  \u001b[01;32mShowcase.ipynb\u001b[0m*\n"
      ]
     }
    ],
@@ -1103,11 +1067,11 @@
    "execution_count": 23,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:09:56.211386Z",
-     "iopub.status.busy": "2022-03-29T17:09:56.210155Z",
-     "iopub.status.idle": "2022-03-29T17:09:56.221247Z",
-     "shell.execute_reply": "2022-03-29T17:09:56.220253Z",
-     "shell.execute_reply.started": "2022-03-29T17:09:56.211338Z"
+     "iopub.execute_input": "2022-04-19T20:31:07.079592Z",
+     "iopub.status.busy": "2022-04-19T20:31:07.078580Z",
+     "iopub.status.idle": "2022-04-19T20:31:07.087197Z",
+     "shell.execute_reply": "2022-04-19T20:31:07.086137Z",
+     "shell.execute_reply.started": "2022-04-19T20:31:07.079553Z"
     },
     "tags": []
    },
@@ -1135,11 +1099,11 @@
    "execution_count": 24,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:09:57.040251Z",
-     "iopub.status.busy": "2022-03-29T17:09:57.039433Z",
-     "iopub.status.idle": "2022-03-29T17:09:57.047982Z",
-     "shell.execute_reply": "2022-03-29T17:09:57.046971Z",
-     "shell.execute_reply.started": "2022-03-29T17:09:57.040210Z"
+     "iopub.execute_input": "2022-04-19T20:31:08.076755Z",
+     "iopub.status.busy": "2022-04-19T20:31:08.076343Z",
+     "iopub.status.idle": "2022-04-19T20:31:08.089122Z",
+     "shell.execute_reply": "2022-04-19T20:31:08.088081Z",
+     "shell.execute_reply.started": "2022-04-19T20:31:08.076712Z"
     },
     "tags": []
    },
@@ -1166,11 +1130,11 @@
    "execution_count": 25,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:09:57.912191Z",
-     "iopub.status.busy": "2022-03-29T17:09:57.911299Z",
-     "iopub.status.idle": "2022-03-29T17:09:57.973617Z",
-     "shell.execute_reply": "2022-03-29T17:09:57.970810Z",
-     "shell.execute_reply.started": "2022-03-29T17:09:57.912143Z"
+     "iopub.execute_input": "2022-04-19T20:31:08.990855Z",
+     "iopub.status.busy": "2022-04-19T20:31:08.990417Z",
+     "iopub.status.idle": "2022-04-19T20:31:09.036205Z",
+     "shell.execute_reply": "2022-04-19T20:31:09.030901Z",
+     "shell.execute_reply.started": "2022-04-19T20:31:08.990765Z"
     },
     "tags": []
    },
@@ -1189,7 +1153,7 @@
      "traceback": [
       "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
       "\u001b[0;31mImportError\u001b[0m                               Traceback (most recent call last)",
-      "\u001b[0;32m/tmp/ipykernel_3329/2853914029.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mmodule_circular_a\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[0;32m/tmp/ipykernel_2447/2853914029.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mmodule_circular_a\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
       "\u001b[0;32m/media/sf_Dropbox/code/justuse/docs/module_circular_a.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Hello from A!\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mmodule_circular_b\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0mfoo\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m23\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
       "\u001b[0;32m/media/sf_Dropbox/code/justuse/docs/module_circular_b.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mmodule_circular_a\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mfoo\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Hello from B!\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfoo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
       "\u001b[0;31mImportError\u001b[0m: cannot import name 'foo' from partially initialized module 'module_circular_a' (most likely due to a circular import) (/media/sf_Dropbox/code/justuse/docs/module_circular_a.py)"
@@ -1205,11 +1169,11 @@
    "execution_count": 26,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:10:00.083951Z",
-     "iopub.status.busy": "2022-03-29T17:10:00.083080Z",
-     "iopub.status.idle": "2022-03-29T17:10:00.092100Z",
-     "shell.execute_reply": "2022-03-29T17:10:00.091117Z",
-     "shell.execute_reply.started": "2022-03-29T17:10:00.083921Z"
+     "iopub.execute_input": "2022-04-19T20:31:09.998500Z",
+     "iopub.status.busy": "2022-04-19T20:31:09.998035Z",
+     "iopub.status.idle": "2022-04-19T20:31:10.006325Z",
+     "shell.execute_reply": "2022-04-19T20:31:10.005255Z",
+     "shell.execute_reply.started": "2022-04-19T20:31:09.998461Z"
     },
     "tags": []
    },
@@ -1237,11 +1201,11 @@
    "execution_count": 27,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:10:01.836206Z",
-     "iopub.status.busy": "2022-03-29T17:10:01.835205Z",
-     "iopub.status.idle": "2022-03-29T17:10:03.818776Z",
-     "shell.execute_reply": "2022-03-29T17:10:03.817885Z",
-     "shell.execute_reply.started": "2022-03-29T17:10:01.836163Z"
+     "iopub.execute_input": "2022-04-19T20:31:10.776789Z",
+     "iopub.status.busy": "2022-04-19T20:31:10.776427Z",
+     "iopub.status.idle": "2022-04-19T20:31:10.785454Z",
+     "shell.execute_reply": "2022-04-19T20:31:10.784168Z",
+     "shell.execute_reply.started": "2022-04-19T20:31:10.776750Z"
     },
     "tags": []
    },
@@ -1267,11 +1231,11 @@
    "execution_count": 28,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:10:03.822150Z",
-     "iopub.status.busy": "2022-03-29T17:10:03.820565Z",
-     "iopub.status.idle": "2022-03-29T17:10:09.823025Z",
-     "shell.execute_reply": "2022-03-29T17:10:09.821773Z",
-     "shell.execute_reply.started": "2022-03-29T17:10:03.822108Z"
+     "iopub.execute_input": "2022-04-19T20:31:11.391605Z",
+     "iopub.status.busy": "2022-04-19T20:31:11.391237Z",
+     "iopub.status.idle": "2022-04-19T20:31:11.407985Z",
+     "shell.execute_reply": "2022-04-19T20:31:11.406416Z",
+     "shell.execute_reply.started": "2022-04-19T20:31:11.391564Z"
     },
     "tags": []
    },
@@ -1358,26 +1322,17 @@
    "execution_count": 29,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:11:52.533686Z",
-     "iopub.status.busy": "2022-03-29T17:11:52.533263Z",
-     "iopub.status.idle": "2022-03-29T17:11:52.566761Z",
-     "shell.execute_reply": "2022-03-29T17:11:52.565859Z",
-     "shell.execute_reply.started": "2022-03-29T17:11:52.533646Z"
+     "iopub.execute_input": "2022-04-19T20:31:16.432872Z",
+     "iopub.status.busy": "2022-04-19T20:31:16.432344Z",
+     "iopub.status.idle": "2022-04-19T20:31:16.439076Z",
+     "shell.execute_reply": "2022-04-19T20:31:16.437645Z",
+     "shell.execute_reply.started": "2022-04-19T20:31:16.432815Z"
     },
     "tags": []
    },
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.main\u001b[1;30m: \u001b[0mcase = (False, False, True, False)\n",
-      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.buffet_old\u001b[1;30m: \u001b[0mresult = <module 'numpy' from '/home/thorsten/anaconda3/lib/python3.8/site-packages/numpy/__init__.py'>\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
-    "np = use(\"numpy\")"
+    "import numpy"
    ]
   },
   {
@@ -1392,11 +1347,11 @@
    "execution_count": 30,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:13:24.617281Z",
-     "iopub.status.busy": "2022-03-29T17:13:24.616920Z",
-     "iopub.status.idle": "2022-03-29T17:13:25.286756Z",
-     "shell.execute_reply": "2022-03-29T17:13:25.285785Z",
-     "shell.execute_reply.started": "2022-03-29T17:13:24.617243Z"
+     "iopub.execute_input": "2022-04-19T20:31:18.138589Z",
+     "iopub.status.busy": "2022-04-19T20:31:18.138198Z",
+     "iopub.status.idle": "2022-04-19T20:31:18.574652Z",
+     "shell.execute_reply": "2022-04-19T20:31:18.573498Z",
+     "shell.execute_reply.started": "2022-04-19T20:31:18.138553Z"
     },
     "tags": []
    },
@@ -1407,20 +1362,10 @@
      "text": [
       "Please check your browser to select options and filters for aspects.\n"
      ]
-    },
-    {
-     "data": {
-      "text/plain": [
-       "<module 'numpy' from '/home/thorsten/anaconda3/lib/python3.8/site-packages/numpy/__init__.py'>"
-      ]
-     },
-     "execution_count": 30,
-     "metadata": {},
-     "output_type": "execute_result"
     }
    ],
    "source": [
-    "np @  use.woody_logger"
+    "numpy @  use"
    ]
   },
   {
@@ -1443,56 +1388,17 @@
    "execution_count": 31,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:13:34.619405Z",
-     "iopub.status.busy": "2022-03-29T17:13:34.618424Z",
-     "iopub.status.idle": "2022-03-29T17:13:34.848266Z",
-     "shell.execute_reply": "2022-03-29T17:13:34.847301Z",
-     "shell.execute_reply.started": "2022-03-29T17:13:34.619364Z"
+     "iopub.execute_input": "2022-04-19T20:31:29.350706Z",
+     "iopub.status.busy": "2022-04-19T20:31:29.350337Z",
+     "iopub.status.idle": "2022-04-19T20:31:29.526291Z",
+     "shell.execute_reply": "2022-04-19T20:31:29.525128Z",
+     "shell.execute_reply.started": "2022-04-19T20:31:29.350664Z"
     },
     "tags": []
    },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
-      "('_ipython_display_',) {} -> numpy.__getattr__\n",
-      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
-      "('_repr_mimebundle_',) {} -> numpy.__getattr__\n",
-      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
-      "('_repr_html_',) {} -> numpy.__getattr__\n",
-      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
-      "('_repr_markdown_',) {} -> numpy.__getattr__\n",
-      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
-      "('_repr_svg_',) {} -> numpy.__getattr__\n",
-      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
-      "('_repr_png_',) {} -> numpy.__getattr__\n",
-      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
-      "('_repr_pdf_',) {} -> numpy.__getattr__\n",
-      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
-      "('_repr_jpeg_',) {} -> numpy.__getattr__\n",
-      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
-      "('_repr_latex_',) {} -> numpy.__getattr__\n",
-      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
-      "('_repr_json_',) {} -> numpy.__getattr__\n",
-      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
-      "('_repr_javascript_',) {} -> numpy.__getattr__\n"
-     ]
-    },
-    {
-     "data": {
-      "text/plain": [
-       "<module 'numpy' from '/home/thorsten/anaconda3/lib/python3.8/site-packages/numpy/__init__.py'>"
-      ]
-     },
-     "execution_count": 31,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
-    "use.apply_aspect(np, use.woody_logger)"
+    "use.apply_aspect(numpy, use.woody_logger)"
    ]
   },
   {
@@ -1504,14 +1410,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 32,
+   "execution_count": 34,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:13:47.971129Z",
-     "iopub.status.busy": "2022-03-29T17:13:47.970573Z",
-     "iopub.status.idle": "2022-03-29T17:13:48.094803Z",
-     "shell.execute_reply": "2022-03-29T17:13:48.093669Z",
-     "shell.execute_reply.started": "2022-03-29T17:13:47.971088Z"
+     "iopub.execute_input": "2022-04-19T20:33:10.319606Z",
+     "iopub.status.busy": "2022-04-19T20:33:10.318943Z",
+     "iopub.status.idle": "2022-04-19T20:33:10.340644Z",
+     "shell.execute_reply": "2022-04-19T20:33:10.339856Z",
+     "shell.execute_reply.started": "2022-04-19T20:33:10.319555Z"
     },
     "tags": []
    },
@@ -1520,42 +1426,70 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "([1, 2, 3],) {} -> numpy.array\n",
-      "(<class 'int'>,) {} -> numpy.dtype\n"
+      "((3, 3),) {} -> numpy::zeros\n",
+      "(0.0,) {} -> numpy::isfinite\n",
+      "-> numpy::isfinite (in 17901 ns (2e-05 sec) -> True <class 'numpy.bool_'>\n",
+      "(0.0,) {} -> numpy::isfinite\n",
+      "-> numpy::isfinite (in 14276 ns (1e-05 sec) -> True <class 'numpy.bool_'>\n",
+      "(0.0,) {} -> numpy::isfinite\n",
+      "-> numpy::isfinite (in 14157 ns (1e-05 sec) -> True <class 'numpy.bool_'>\n",
+      "(0.0,) {} -> numpy::isfinite\n",
+      "-> numpy::isfinite (in 14488 ns (1e-05 sec) -> True <class 'numpy.bool_'>\n",
+      "(0.0,) {} -> numpy::isfinite\n",
+      "-> numpy::isfinite (in 13604 ns (1e-05 sec) -> True <class 'numpy.bool_'>\n",
+      "(0.0,) {} -> numpy::isfinite\n",
+      "-> numpy::isfinite (in 14602 ns (1e-05 sec) -> True <class 'numpy.bool_'>\n",
+      "(0.0,) {} -> numpy::isfinite\n",
+      "-> numpy::isfinite (in 21241 ns (2e-05 sec) -> True <class 'numpy.bool_'>\n",
+      "(0.0,) {} -> numpy::isfinite\n",
+      "-> numpy::isfinite (in 18995 ns (2e-05 sec) -> True <class 'numpy.bool_'>\n",
+      "(0.0,) {} -> numpy::isfinite\n",
+      "-> numpy::isfinite (in 12165 ns (1e-05 sec) -> True <class 'numpy.bool_'>\n",
+      "-> numpy::zeros (in 8238 ns (1e-05 sec) -> [[0. 0. 0.]\n",
+      " [0. 0. 0.]\n",
+      " [0. 0. 0.]] <class 'numpy.ndarray'>\n",
+      "(0.0,) {} -> numpy::isfinite\n",
+      "-> numpy::isfinite (in 12119 ns (1e-05 sec) -> True <class 'numpy.bool_'>\n",
+      "(0.0,) {} -> numpy::isfinite\n",
+      "-> numpy::isfinite (in 12556 ns (1e-05 sec) -> True <class 'numpy.bool_'>\n",
+      "(0.0,) {} -> numpy::isfinite\n",
+      "-> numpy::isfinite (in 10597 ns (1e-05 sec) -> True <class 'numpy.bool_'>\n",
+      "(0.0,) {} -> numpy::isfinite\n",
+      "-> numpy::isfinite (in 10533 ns (1e-05 sec) -> True <class 'numpy.bool_'>\n",
+      "(0.0,) {} -> numpy::isfinite\n",
+      "-> numpy::isfinite (in 10200 ns (1e-05 sec) -> True <class 'numpy.bool_'>\n",
+      "(0.0,) {} -> numpy::isfinite\n",
+      "-> numpy::isfinite (in 10335 ns (1e-05 sec) -> True <class 'numpy.bool_'>\n",
+      "(0.0,) {} -> numpy::isfinite\n",
+      "-> numpy::isfinite (in 24559 ns (2e-05 sec) -> True <class 'numpy.bool_'>\n",
+      "(0.0,) {} -> numpy::isfinite\n",
+      "-> numpy::isfinite (in 12838 ns (1e-05 sec) -> True <class 'numpy.bool_'>\n",
+      "(0.0,) {} -> numpy::isfinite\n",
+      "-> numpy::isfinite (in 11179 ns (1e-05 sec) -> True <class 'numpy.bool_'>\n"
      ]
     },
     {
-     "ename": "TypeError",
-     "evalue": "issubclass() arg 2 must be a class or tuple of classes",
-     "output_type": "error",
-     "traceback": [
-      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
-      "\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
-      "\u001b[0;32m/tmp/ipykernel_3329/3038565759.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/aspectizing.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    233\u001b[0m         \u001b[0;31m# )\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    234\u001b[0m         print(\n\u001b[0;32m--> 235\u001b[0;31m             \u001b[0;34mf\"-> {module}{qualname} (in {after - before} ns ({round((after - before) / 10**9, 5)} sec) -> {res} {type(res)}\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    236\u001b[0m         )\n\u001b[1;32m    237\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mres\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36m_array_str_implementation\u001b[0;34m(a, max_line_width, precision, suppress_small, array2string)\u001b[0m\n\u001b[1;32m   1549\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0m_guarded_repr_or_str\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1550\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1551\u001b[0;31m     \u001b[0;32mreturn\u001b[0m \u001b[0marray2string\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_line_width\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprecision\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msuppress_small\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m' '\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1552\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1553\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36marray2string\u001b[0;34m(a, max_line_width, precision, suppress_small, separator, prefix, style, formatter, threshold, edgeitems, sign, floatmode, suffix, legacy)\u001b[0m\n\u001b[1;32m    696\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0;34m\"[]\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    697\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 698\u001b[0;31m     \u001b[0;32mreturn\u001b[0m \u001b[0m_array2string\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mseparator\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprefix\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    699\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    700\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m    473\u001b[0m             \u001b[0mrepr_running\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    474\u001b[0m             \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 475\u001b[0;31m                 \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    476\u001b[0m             \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    477\u001b[0m                 \u001b[0mrepr_running\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdiscard\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36m_array2string\u001b[0;34m(a, options, separator, prefix)\u001b[0m\n\u001b[1;32m    499\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    500\u001b[0m     \u001b[0;31m# find the right formatting function for the array\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 501\u001b[0;31m     \u001b[0mformat_function\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_get_format_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    502\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    503\u001b[0m     \u001b[0;31m# skip over \"[\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36m_get_format_function\u001b[0;34m(data, **options)\u001b[0m\n\u001b[1;32m    427\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0mformatdict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'timedelta'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    428\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 429\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mformatdict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'int'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    430\u001b[0m     \u001b[0;32melif\u001b[0m \u001b[0missubclass\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtypeobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_nt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfloating\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    431\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0missubclass\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtypeobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_nt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlongfloat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36m<lambda>\u001b[0;34m()\u001b[0m\n\u001b[1;32m    372\u001b[0m     formatdict = {\n\u001b[1;32m    373\u001b[0m         \u001b[0;34m'bool'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mlambda\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mBoolFormat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 374\u001b[0;31m         \u001b[0;34m'int'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mlambda\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mIntegerFormat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    375\u001b[0m         'float': lambda: FloatingFormat(\n\u001b[1;32m    376\u001b[0m             data, precision, floatmode, suppress, sign, legacy=legacy),\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m   1185\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1186\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msize\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1187\u001b[0;31m             max_str_len = max(len(str(np.max(data))),\n\u001b[0m\u001b[1;32m   1188\u001b[0m                               len(str(np.min(data))))\n\u001b[1;32m   1189\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/aspectizing.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    225\u001b[0m     \u001b[0;34m@\u001b[0m\u001b[0mwraps\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    226\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 227\u001b[0;31m         \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"{args} {kwargs} -> {module}{qualname}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    228\u001b[0m         \u001b[0mbefore\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mperf_counter_ns\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    229\u001b[0m         \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36m_array_repr_implementation\u001b[0;34m(arr, max_line_width, precision, suppress_small, array2string)\u001b[0m\n\u001b[1;32m   1436\u001b[0m         \u001b[0mclass_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"array\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1437\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1438\u001b[0;31m     \u001b[0mskipdtype\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdtype_is_implied\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0marr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msize\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1439\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1440\u001b[0m     \u001b[0mprefix\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mclass_name\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m\"(\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36mdtype_is_implied\u001b[0;34m(dtype)\u001b[0m\n\u001b[1;32m   1388\u001b[0m     \u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mint8\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1389\u001b[0m     \"\"\"\n\u001b[0;32m-> 1390\u001b[0;31m     \u001b[0mdtype\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1391\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0m_format_options\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'legacy'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'1.13'\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtype\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mbool_\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1392\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/aspectizing.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    225\u001b[0m     \u001b[0;34m@\u001b[0m\u001b[0mwraps\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    226\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 227\u001b[0;31m         \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"{args} {kwargs} -> {module}{qualname}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    228\u001b[0m         \u001b[0mbefore\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mperf_counter_ns\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    229\u001b[0m         \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/_dtype.py\u001b[0m in \u001b[0;36m__repr__\u001b[0;34m(dtype)\u001b[0m\n\u001b[1;32m     44\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     45\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__repr__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 46\u001b[0;31m     \u001b[0marg_str\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_construction_repr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minclude_align\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     47\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misalignedstruct\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     48\u001b[0m         \u001b[0marg_str\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0marg_str\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m\", align=True\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/_dtype.py\u001b[0m in \u001b[0;36m_construction_repr\u001b[0;34m(dtype, include_align, short)\u001b[0m\n\u001b[1;32m     98\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0m_subarray_str\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     99\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 100\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0m_scalar_str\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mshort\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mshort\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    101\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    102\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/_dtype.py\u001b[0m in \u001b[0;36m_scalar_str\u001b[0;34m(dtype, short)\u001b[0m\n\u001b[1;32m    102\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    103\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_scalar_str\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mshort\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 104\u001b[0;31m     \u001b[0mbyteorder\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_byte_order_str\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    105\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    106\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtype\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbool_\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/_dtype.py\u001b[0m in \u001b[0;36m_byte_order_str\u001b[0;34m(dtype)\u001b[0m\n\u001b[1;32m    161\u001b[0m     \u001b[0;34m\"\"\" Normalize byteorder to '<' or '>' \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    162\u001b[0m     \u001b[0;31m# hack to obtain the native and swapped byte order characters\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 163\u001b[0;31m     \u001b[0mswapped\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnewbyteorder\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'S'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    164\u001b[0m     \u001b[0mnative\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mswapped\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnewbyteorder\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'S'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    165\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/aspectizing.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    233\u001b[0m         \u001b[0;31m# )\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    234\u001b[0m         print(\n\u001b[0;32m--> 235\u001b[0;31m             \u001b[0;34mf\"-> {module}{qualname} (in {after - before} ns ({round((after - before) / 10**9, 5)} sec) -> {res} {type(res)}\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    236\u001b[0m         )\n\u001b[1;32m    237\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mres\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/_dtype.py\u001b[0m in \u001b[0;36m__str__\u001b[0;34m(dtype)\u001b[0m\n\u001b[1;32m     37\u001b[0m     \u001b[0;32melif\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubdtype\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     38\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0m_subarray_str\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 39\u001b[0;31m     \u001b[0;32melif\u001b[0m \u001b[0missubclass\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mflexible\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misnative\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     40\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     41\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;31mTypeError\u001b[0m: issubclass() arg 2 must be a class or tuple of classes"
-     ]
+     "data": {
+      "text/plain": [
+       "array([[0., 0., 0.],\n",
+       "       [0., 0., 0.],\n",
+       "       [0., 0., 0.]])"
+      ]
+     },
+     "execution_count": 34,
+     "metadata": {},
+     "output_type": "execute_result"
     }
    ],
    "source": [
-    "np.array([1,2,3])"
+    "np.zeros((3,3))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "This looks a bit weird in jupyter, but if run from a module or interactive interpreter, this should work as expected."
    ]
   },
   {
@@ -1568,14 +1502,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 34,
+   "execution_count": 35,
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-03-29T17:14:26.695988Z",
-     "iopub.status.busy": "2022-03-29T17:14:26.695478Z",
-     "iopub.status.idle": "2022-03-29T17:14:26.739781Z",
-     "shell.execute_reply": "2022-03-29T17:14:26.738349Z",
-     "shell.execute_reply.started": "2022-03-29T17:14:26.695949Z"
+     "iopub.execute_input": "2022-04-19T20:34:01.703652Z",
+     "iopub.status.busy": "2022-04-19T20:34:01.702628Z",
+     "iopub.status.idle": "2022-04-19T20:34:01.724646Z",
+     "shell.execute_reply": "2022-04-19T20:34:01.723760Z",
+     "shell.execute_reply.started": "2022-04-19T20:34:01.703621Z"
     },
     "tags": []
    },
@@ -1584,47 +1518,15 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "() {} -> numpy.__dir__\n",
-      "-> numpy.__dir__ (in 103966 ns (0.0001 sec) -> ['zeros', 'diagflat', 'reciprocal', '__getattr__', 'PINF', 'UFUNC_BUFSIZE_DEFAULT', 'base_repr', 'greater_equal', 'rollaxis', 'sort', 'allclose', 'isin', 'save', 'Bytes0', 'signedinteger', 's_', 'put', 'diag_indices_from', 'hsplit', 'roots', 'shares_memory', 'equal', 'identity', 'add', 'nanquantile', 'Str0', 'lookfor', 'issubsctype', 'format_parser', 'TooHardError', 'DataSource', 'iinfo', 'dsplit', 'around', 'add_docstring', 'ma', 'recarray', 'reshape', 'infty', '_distributor_init', 'polyder', 'void0', 'os', '__doc__', 'array', 'warnings', 'argpartition', 'single', 'char', 'MAY_SHARE_BOUNDS', 'test', 'sometrue', 'inf', 'spacing', 'sctypeDict', 'atleast_1d', 'SHIFT_INVALID', 'load', 'transpose', 'mask_indices', 'put_along_axis', 'flatnonzero', 'False_', 'roll', 'nanmean', 'alen', 'promote_types', 'kernel_version', 'flip', '__loader__', 'source', 'Datetime64', 'mintypecode', 'product', 'ndfromtxt', 'linalg', 'longfloat', 'multiply', 'nanpercentile', 'SHIFT_DIVIDEBYZERO', '_version', 'repeat', 'longlong', 'tril', 'divmod', 'negative', 'add_newdoc_ufunc', 'str_', 'isfortran', 'logaddexp2', 'mod', 'min_scalar_type', 'ERR_DEFAULT', 'signbit', 'expand_dims', 'corrcoef', 'pad', 'geterrobj', 'radians', 'amax', 'indices', 'PZERO', 'array_equiv', 'True_', 'string_', 'asanyarray', 'nonzero', 'float32', 'ubyte', 'ScalarType', 'find_common_type', 'hamming', 'who', 'blackman', 'ones', 'divide', 'cov', 'cdouble', 'float_', 'ndim', 'format_float_scientific', 'diagonal', 'typecodes', 'void', 'convolve', 'FPE_DIVIDEBYZERO', 'setxor1d', 'finfo', 'RAISE', 'mkl', 'asmatrix', 'logaddexp', 'geterrcall', 'issubclass_', 'savetxt', '_globals', 'may_share_memory', 'append', 'take', '__cached__', 'broadcast_shapes', '_pytesttester', 'maximum_sctype', 'hanning', 'asfarray', 'copysign', 'datetime_as_string', 'clongfloat', 'triu_indices_from', 'broadcast_arrays', 'invert', 'cfloat', 'unravel_index', 'packbits', 'log2', 'uintc', 'arcsinh', 'ix_', 'newaxis', 'floating', 'absolute', 'meshgrid', 'little_endian', 'get_array_wrap', 'histogramdd', 'sinh', 'sqrt', 'greater', 'Uint64', '_financial_names', 'dstack', 'ogrid', 'rad2deg', '__mkl_version__', 'correlate', 'seterrobj', 'disp', 'tensordot', 'vstack', 'round', 'unpackbits', 'angle', 'choose', 'quantile', 'full_like', 'csingle', 'fmod', 'cbrt', 'bitwise_not', '_mat', 'bitwise_and', 'bincount', 'bmat', '__expired_functions__', 'polyfit', 'minimum', 'info', 'ravel_multi_index', 'expm1', 'trunc', 'bartlett', 'Infinity', 'datetime_data', '__git_version__', 'vdot', 'matmul', 'BUFSIZE', '__builtins__', 'array_equal', 'floor', 'nanmin', 'frompyfunc', 'clip', 'sum', 'polyint', 'i0', 'loads', 'log', 'float16', 'einsum', 'NZERO', 'polynomial', 'shape', 'fromstring', 'issctype', 'matrixlib', 'sctypes', 'nansum', 'where', 'polymul', 'delete', 'hypot', '__config__', 'cross', 'isscalar', 'vsplit', 'matrix', 'tanh', 'row_stack', 'int64', 'true_divide', 'savez', 'errstate', 'interp', 'nanstd', 'positive', 'asarray_chkfinite', 'all', 'histogram2d', 'diag_indices', 'apply_over_axes', 'nditer', 'sort_complex', 'ufunc', 'printoptions', 'sign', 'average', 'fliplr', 'nanprod', 'int0', 'fromiter', 'memmap', 'WRAP', 'array_str', 'intc', 'polysub', 'ndarray', 'alltrue', 'use_hugepage', 'nextafter', 'zeros_like', 'apply_along_axis', 'arctanh', 'cast', 'place', 'ascontiguousarray', 'deg2rad', 'tri', 'ceil', 'iscomplex', 'complex64', 'frombuffer', 'recfromtxt', '__package__', 'arange', 'datetime64', 'ushort', 'nanargmin', 'amin', 'log1p', 'sctype2char', 'squeeze', '_NoValue', 'argmin', 'ERR_LOG', 'euler_gamma', 'oldnumeric', 'can_cast', 'fix', 'Inf', 'is_busday', 'insert', 'MAXDIMS', 'asfortranarray', 'setbufsize', 'arctan', 'outer', 'argwhere', 'deprecate_with_doc', 'logical_not', 'CLIP', 'deprecate', 'isnan', 'bool8', 'clongdouble', 'intersect1d', 'mat', 'concatenate', 'ndenumerate', 'flipud', 'hstack', 'bytes_', 'isneginf', 'real_if_close', 'NaN', 'obj2sctype', 'getbufsize', 'inner', 'fromregex', 'compress', 'trapz', 'degrees', 'busday_count', 'SHIFT_OVERFLOW', 'fromfunction', 'fft', 'compat', 'logical_and', 'isinf', 'prod', 'index_exp', 'conjugate', 'isrealobj', 'searchsorted', 'histogram_bin_edges', 'ALLOW_THREADS', 'swapaxes', 'VisibleDeprecationWarning', 'copyto', 'bitwise_xor', 'uint0', 'atleast_2d', 'diag', 'unicode_', 'msort', 'dot', 'number', 'numarray', 'broadcast_to', 'trace', 'longdouble', '__version__', 'kaiser', 'result_type', 'poly1d', 'split', 'moveaxis', 'take_along_axis', 'rint', 'arctan2', 'format_float_positional', 'conj', 'object0', 'isclose', 'floor_divide', 'AxisError', 'float64', '__name__', 'get_include', 'byte_bounds', 'nan', 'atleast_3d', 'column_stack', 'count_nonzero', 'busday_offset', 'triu', 'cumsum', 'require', 'set_printoptions', 'full', 'fill_diagonal', 'tan', 'uint16', 'union1d', 'chararray', 'iscomplexobj', 'FPE_UNDERFLOW', 'flexible', 'arccos', 'isreal', 'ERR_CALL', 'nanvar', 'tile', 'ravel', 'array_repr', 'cumprod', 'lexsort', 'diff', 'modf', '__file__', 'std', 'Tester', 'eye', 'lcm', 'heaviside', 'lib', 'putmask', 'percentile', 'issubdtype', 'ediff1d', 'longcomplex', 'record', 'generic', 'geterr', 'iterable', 'nanmedian', 'int32', 'unsignedinteger', 'nan_to_num', 'uint8', 'safe_eval', 'math', 'mean', 'e', 'partition', 'NAN', 'double', 'arccosh', 'float_power', 'trim_zeros', 'log10', 'nancumsum', 'real', '_add_newdoc_ufunc', '__dir__', 'right_shift', 'busdaycalendar', 'sys', 'ModuleDeprecationWarning', 'copy', 'genfromtxt', 'array_split', 'less', 'FPE_OVERFLOW', 'ERR_WARN', 'inexact', 'isnat', 'uint64', 'complex256', 'imag', 'triu_indices', 'get_printoptions', 'complex128', 'MAY_SHARE_EXACT', 'add_newdoc', 'logspace', 'emath', 'extract', 'uint', 'seterr', 'fabs', 'block', 'ctypeslib', 'ERR_IGNORE', 'intp', 'subtract', 'median', 'round_', 'show_config', 'cosh', 'mgrid', 'compare_chararrays', 'NINF', 'square', 'nested_iters', 'digitize', 'size', 'pi', 'loadtxt', 'exp', 'FPE_INVALID', 'recfromcsv', 'sin', 'uintp', 'broadcast', 'power', 'piecewise', 'SHIFT_UNDERFLOW', 'fromfile', 'asscalar', 'binary_repr', 'argsort', 'set_numeric_ops', 'cumproduct', 'uint32', 'bool_', 'select', 'UFUNC_PYVALS_NAME', '__spec__', 'ldexp', 'int8', 'einsum_path', 'byte', 'fmin', 'ERR_PRINT', 'gradient', 'set_string_function', 'r_', 'min', 'polyadd', 'logical_xor', 'isposinf', 'poly', 'mafromtxt', 'c_', 'integer', 'random', '__NUMPY_SETUP__', 'tril_indices_from', 'core', 'stack', 'ulonglong', 'setdiff1d', 'left_shift', 'ndindex', 'ERR_RAISE', 'savez_compressed', '__deprecated_attrs__', 'maximum', 'singlecomplex', 'nbytes', 'cos', 'vander', 'common_type', 'dtype', 'nanargmax', 'vectorize', 'complexfloating', 'fastCopyAndTranspose', 'tril_indices', 'half', 'empty_like', 'FLOATING_POINT_SUPPORT', 'RankWarning', 'not_equal', 'rec', 'frexp', 'nancumprod', '__all__', 'testing', 'character', 'asarray', 'abs', 'ptp', 'array2string', 'timedelta64', 'flatiter', 'less_equal', 'int16', 'gcd', 'geomspace', 'tracemalloc_domain', 'histogram', 'complex_', 'polyval', 'nanmax', 'logical_or', 'unwrap', 'unique', 'in1d', 'typename', 'short', 'ComplexWarning', 'ones_like', 'exp2', 'isfinite', 'linspace', '__path__', 'bytes0', 'empty', 'var', 'int_', 'polydiv', 'float128', 'object_', 'resize', 'bitwise_or', '_UFUNC_API', 'seterrcall', 'remainder', 'fmax', 'max', 'sinc', 'MachAr', 'version', 'any', 'rot90', 'argmax', 'arcsin', 'str0', 'kron'] <class 'list'>\n",
-      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
-      "('_ipython_display_',) {} -> numpy.__getattr__\n",
-      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
-      "('_repr_mimebundle_',) {} -> numpy.__getattr__\n",
-      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
-      "('_repr_html_',) {} -> numpy.__getattr__\n",
-      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
-      "('_repr_markdown_',) {} -> numpy.__getattr__\n",
-      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
-      "('_repr_svg_',) {} -> numpy.__getattr__\n",
-      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
-      "('_repr_png_',) {} -> numpy.__getattr__\n",
-      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
-      "('_repr_pdf_',) {} -> numpy.__getattr__\n",
-      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
-      "('_repr_jpeg_',) {} -> numpy.__getattr__\n",
-      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
-      "('_repr_latex_',) {} -> numpy.__getattr__\n",
-      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
-      "('_repr_json_',) {} -> numpy.__getattr__\n",
-      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
-      "('_repr_javascript_',) {} -> numpy.__getattr__\n"
+      "() {} -> numpy::__dir__\n",
+      "-> numpy::__dir__ (in 112171 ns (0.00011 sec) -> ['nancumprod', 'ERR_PRINT', 'asscalar', 'atleast_3d', 'unsignedinteger', 'FPE_INVALID', 'complex128', 'inexact', 'fromfile', 'rad2deg', 'arctan', 'mean', 'ulonglong', 'fliplr', 'intc', 'trace', 'Uint64', '__package__', 'vdot', 'common_type', 'indices', 'dot', 'fromregex', 'ceil', 'tile', 'os', '__NUMPY_SETUP__', 'polyval', 'bitwise_not', 'isfortran', 'putmask', 'math', 'ptp', 'polydiv', 'deprecate_with_doc', 'NaN', 'rollaxis', 'get_include', '__builtins__', 'isposinf', 'csingle', 'column_stack', 'unique', 'result_type', 'kernel_version', 'nanstd', 'var', 'isin', 'einsum_path', 'arcsin', 'savez_compressed', 'ERR_RAISE', 'nanvar', 'DataSource', 'asfarray', 'pad', '__getattr__', 'trunc', 'half', 'fastCopyAndTranspose', 'gradient', 'add_newdoc_ufunc', 'ravel_multi_index', 'int64', 'nanmedian', 'datetime_data', 'FPE_OVERFLOW', 'mafromtxt', 'heaviside', 'nbytes', 'polymul', 'ndindex', 'place', 'digitize', 'MAXDIMS', 'histogram_bin_edges', 'copy', 'get_array_wrap', 'imag', 'savetxt', 'mat', 'logspace', 'frombuffer', 'NINF', 'greater_equal', 'fabs', '__all__', 'divmod', 'meshgrid', 'multiply', 'prod', 'zeros', 'float16', 'outer', 'logical_or', 'busday_count', 'cosh', 'around', 'sign', 'put', 'asmatrix', 'ctypeslib', 'compress', 'asarray', 'diff', 'kaiser', 'fmin', 'array2string', '__loader__', 'tanh', 'load', 'rot90', 'complex256', 'vectorize', 'conjugate', 'sctype2char', 'cos', 'euler_gamma', 'stack', 'RankWarning', 'typecodes', 'hypot', 'sin', 'finfo', '_add_newdoc_ufunc', 'ERR_DEFAULT', 'str0', 'object_', 'setdiff1d', 'triu_indices', 'str_', 'ModuleDeprecationWarning', '_UFUNC_API', 'extract', 'cumsum', 'bool8', 'UFUNC_PYVALS_NAME', 'float64', 'longfloat', 'packbits', 'BUFSIZE', '_financial_names', 'corrcoef', 'histogram', 'where', 'fill_diagonal', 'bytes_', 'character', 'isreal', 'expm1', 'divide', 'uint64', 'issubsctype', 'ndim', 'FPE_UNDERFLOW', 'hstack', 'row_stack', 'sqrt', 'bartlett', 'kron', 'alltrue', 'absolute', 'equal', 'real', 'Bytes0', '__config__', 'signbit', 'broadcast', 'array_equal', 'byte', 'memmap', 'Datetime64', 'r_', 'source', 'logaddexp2', 'hsplit', 'isfinite', 'PINF', 'arange', 'recfromtxt', 'logaddexp', 'asfortranarray', 'isscalar', 'insert', 'UFUNC_BUFSIZE_DEFAULT', 'broadcast_shapes', 'alen', 'setxor1d', 'WRAP', 'exp', 'little_endian', 'recarray', 'diag_indices_from', '__cached__', 'zeros_like', 'append', 'compare_chararrays', 'ERR_WARN', 'int8', 'take_along_axis', 'save', '_version', 'RAISE', 'longdouble', 'bytes0', 'eye', 'cov', 'frompyfunc', 'tri', 'busday_offset', 'trim_zeros', 'polynomial', 'TooHardError', 'promote_types', 'positive', 'negative', 'matmul', 'sort_complex', 'repeat', 'frexp', 'setbufsize', 'copysign', 'core', 'int32', 'remainder', 'seterrobj', 'nanmin', 'datetime64', 'iscomplexobj', 'atleast_1d', 'ComplexWarning', 'swapaxes', 'mgrid', 'disp', 'hamming', 'percentile', 'partition', 'chararray', 'unravel_index', 'show_config', 'argsort', '__name__', 'e', 'diag', 'select', 'Tester', 'copyto', 'split', 'lookfor', 'complex64', 'int16', 'tensordot', 'flatnonzero', 'testing', 'all', 'conj', 'maximum_sctype', 'numarray', 'cumproduct', 'triu', '__doc__', 'seterr', 'PZERO', '__file__', 'intp', 'nextafter', 'vander', 'histogramdd', 'arctanh', 'uintp', 'complexfloating', 'byte_bounds', 'nanargmin', '__path__', 'vsplit', 'uint0', 'SHIFT_INVALID', 'record', 'random', 'ravel', 'gcd', 'subtract', 'identity', 'sum', 'format_float_positional', 'ones_like', 'int_', 'ERR_IGNORE', 'busdaycalendar', 'deprecate', 'number', 'moveaxis', 'fmod', 'in1d', 'string_', 'logical_xor', 'floor_divide', 'sinc', 'integer', 'tril_indices', 'Inf', 'tan', 'uint8', 'set_printoptions', 'resize', 'False_', 'quantile', 'MachAr', 'floor', 'polysub', 'less_equal', 'degrees', 'greater', 'fromstring', 'set_string_function', 'bitwise_and', 'unicode_', '__spec__', 'isclose', 'mod', 'shape', 'float_power', 'iinfo', 'put_along_axis', 'intersect1d', 'nan', 'tril_indices_from', 'ScalarType', 'i0', 'asanyarray', 'dsplit', 'matrix', 'array_equiv', 'get_printoptions', 'typename', 'fft', 'arctan2', 'geterrcall', 'may_share_memory', 'abs', 'set_numeric_ops', 'hanning', 'amin', 'ldexp', 'complex_', 'argwhere', 'allclose', 'min', 'nancumsum', 'single', 'object0', 'log10', 'dstack', 'warnings', 'cdouble', 'take', 'NZERO', 'nan_to_num', 'seterrcall', 'log2', 'safe_eval', 'issubclass_', 'SHIFT_DIVIDEBYZERO', 'nested_iters', 'polyfit', 'triu_indices_from', 'average', 'VisibleDeprecationWarning', 'broadcast_arrays', 'poly', 'array_repr', '__dir__', 'count_nonzero', 'transpose', 'argmin', 'ascontiguousarray', 'bool_', 'rint', 'sys', 'binary_repr', 'bitwise_or', 'oldnumeric', '__mkl_version__', 'spacing', 'deg2rad', 'isneginf', 'newaxis', 'cbrt', 'cast', 'angle', 'argpartition', 'bitwise_xor', 'ERR_CALL', 'timedelta64', 'issctype', 'apply_over_axes', 'ndfromtxt', 'logical_not', 'void0', 'right_shift', 'diagflat', 'cross', 'version', 'datetime_as_string', 'singlecomplex', 'trapz', 'cumprod', 'nonzero', 'issubdtype', 'array', 'ERR_LOG', 'piecewise', 'sinh', 'inner', 'any', 'unwrap', 'add_docstring', 'nanprod', 'void', 'empty', 'array_split', 'Infinity', 'sctypes', 'power', 'nditer', 'clongfloat', 'ALLOW_THREADS', 'histogram2d', 'product', 'True_', 'block', 'max', 'linalg', 'compat', 'cfloat', 'bmat', 'longlong', 'arcsinh', 'index_exp', 'Str0', 'reshape', 'c_', '_NoValue', 'blackman', 'floating', 'ediff1d', 'CLIP', 'flexible', 'radians', 'iterable', 'invert', 'uint32', 'polyint', 'MAY_SHARE_EXACT', 'choose', 'reciprocal', 'tracemalloc_domain', 'FPE_DIVIDEBYZERO', 'polyder', 'fromfunction', 'iscomplex', 'char', 'float32', 'poly1d', 'log1p', 'generic', 'square', 'searchsorted', '__version__', 'sort', 'full', 'logical_and', 'lcm', 'longcomplex', '__deprecated_attrs__', 'ushort', 'arccos', 'nanpercentile', 'less', 'printoptions', 'use_hugepage', 'mask_indices', 'atleast_2d', 'who', '__expired_functions__', 'ubyte', 'maximum', 'linspace', '_mat', 'dtype', 'flipud', 'minimum', 'ix_', 'isrealobj', 'inf', 'ndarray', 'nanquantile', 'format_parser', 'savez', 'clip', 'add', 'SHIFT_OVERFLOW', 'empty_like', 'lexsort', 'pi', 'base_repr', 'mintypecode', 'nanargmax', 'info', 'double', 'flip', 'std', 'uint16', 'median', 'short', 'nanmax', 'FLOATING_POINT_SUPPORT', 'concatenate', 'is_busday', 'errstate', 'uint', 'exp2', 'find_common_type', 'genfromtxt', 'not_equal', 'float128', 'expand_dims', 'left_shift', 'fix', 'recfromcsv', 'getbufsize', 'format_float_scientific', 'infty', 'nansum', 'roots', 'isnan', 'roll', 'ndenumerate', '_distributor_init', 'broadcast_to', 'test', 'vstack', 'bincount', 'matrixlib', '__git_version__', 'array_str', 'MAY_SHARE_BOUNDS', 'delete', 'ogrid', 'einsum', 'apply_along_axis', '_globals', 'nanmean', 'correlate', 'tril', 'arccosh', 'clongdouble', 'loads', 'true_divide', 'shares_memory', 'signedinteger', 'unpackbits', 'require', 'uintc', 'fromiter', 'log', 'ma', 'lib', 'fmax', 'real_if_close', 'union1d', 'isinf', 'sometrue', 'geterr', 'amax', 'ufunc', 'isnat', 'ones', 'argmax', 'size', 'NAN', 'round_', 'geomspace', 'asarray_chkfinite', 'round', 'sctypeDict', 'loadtxt', 'msort', 'diag_indices', 'float_', 'geterrobj', 'convolve', 'mkl', '_pytesttester', 'full_like', 'flatiter', 'obj2sctype', 's_', 'can_cast', 'add_newdoc', 'AxisError', 'int0', 'min_scalar_type', 'diagonal', 'polyadd', 'rec', 'modf', 'SHIFT_UNDERFLOW', 'squeeze', 'interp', 'emath'] <class 'list'>\n"
      ]
-    },
-    {
-     "data": {
-      "text/plain": [
-       "<module 'numpy' from '/home/thorsten/anaconda3/lib/python3.8/site-packages/numpy/__init__.py'>"
-      ]
-     },
-     "execution_count": 34,
-     "metadata": {},
-     "output_type": "execute_result"
     }
    ],
    "source": [
     "from beartype import beartype\n",
     "\n",
-    "use.apply_aspect(np, beartype)"
+    "use.apply_aspect(numpy, beartype)"
    ]
   },
   {
@@ -1639,7 +1541,7 @@
     }
    },
    "source": [
-    "Now all functions in numpy are beartype-checked! You can do the same with your own code, as long as you use() your modules."
+    "Now all functions in numpy are beartype-checked! You don't even need to use() your modules, just import and `use.apply_aspect(mod, decorator)`!"
    ]
   },
   {
@@ -1656,13 +1558,6 @@
    "source": [
     "If you want to learn more about aspect-oriented programming, check out https://en.wikipedia.org/wiki/Aspect-oriented_programming "
    ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "Even though applying decorators this way usually is super simple and nice, one word of caution: in python it sometimes is not clear at all *what* something is. If you do `foo(x)` foo could be a pure function, an object with a `__call__` method or you might be calling the `__init__` method of a class. While it is nice for the user to be oblivious about those details in general, in this case it can be quite confusing and frustrating because each case needs to be handled differently and using a check like isfunction might be catching the wrong things. So, be aware of these potential pitfalls before applying decorators blindly without checking what actually got hit."
-   ]
   }
  ],
  "metadata": {
diff --git a/justuse-0.7.6/docs/Showcase.ipynb b/justuse-0.7.6/docs/Showcase.ipynb
new file mode 100644
index 00000000..318febeb
--- /dev/null
+++ b/justuse-0.7.6/docs/Showcase.ipynb
@@ -0,0 +1,1689 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Welcome to Justuse!"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Installation\n",
+    "Before we start, let's get the latest version"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:08:31.782554Z",
+     "iopub.status.busy": "2022-03-29T17:08:31.781962Z",
+     "iopub.status.idle": "2022-03-29T17:08:37.098058Z",
+     "shell.execute_reply": "2022-03-29T17:08:37.097245Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:31.782412Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Requirement already satisfied: justuse in /home/thorsten/anaconda3/lib/python3.8/site-packages (0.7.5)\n",
+      "Requirement already satisfied: beartype>=0.8.1 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (0.9.1)\n",
+      "Requirement already satisfied: icontract>=2.5.4 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (2.5.5)\n",
+      "Requirement already satisfied: furl>=2.1.2 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (2.1.2)\n",
+      "Requirement already satisfied: pydantic>=1.8.2 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (1.8.2)\n",
+      "Requirement already satisfied: jinja2 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (2.11.3)\n",
+      "Requirement already satisfied: wheel in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (0.37.0)\n",
+      "Requirement already satisfied: toml in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (0.10.2)\n",
+      "Requirement already satisfied: packaging==21.0 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (21.0)\n",
+      "Requirement already satisfied: pip in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (21.3.1)\n",
+      "Requirement already satisfied: requests in /home/thorsten/anaconda3/lib/python3.8/site-packages (from justuse) (2.26.0)\n",
+      "Requirement already satisfied: pyparsing>=2.0.2 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from packaging==21.0->justuse) (3.0.4)\n",
+      "Requirement already satisfied: orderedmultidict>=1.0.1 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from furl>=2.1.2->justuse) (1.0.1)\n",
+      "Requirement already satisfied: six>=1.8.0 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from furl>=2.1.2->justuse) (1.16.0)\n",
+      "Requirement already satisfied: asttokens<3,>=2 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from icontract>=2.5.4->justuse) (2.0.5)\n",
+      "Requirement already satisfied: typing-extensions in /home/thorsten/anaconda3/lib/python3.8/site-packages (from icontract>=2.5.4->justuse) (3.10.0.2)\n",
+      "Requirement already satisfied: MarkupSafe>=0.23 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from jinja2->justuse) (1.1.1)\n",
+      "Requirement already satisfied: certifi>=2017.4.17 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from requests->justuse) (2021.10.8)\n",
+      "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from requests->justuse) (1.26.7)\n",
+      "Requirement already satisfied: idna<4,>=2.5 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from requests->justuse) (3.2)\n",
+      "Requirement already satisfied: charset-normalizer~=2.0.0 in /home/thorsten/anaconda3/lib/python3.8/site-packages (from requests->justuse) (2.0.4)\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING: You are using pip version 21.3.1; however, version 22.0.4 is available.\n",
+      "You should consider upgrading via the '/home/thorsten/anaconda3/bin/python3 -m pip install --upgrade pip' command.\n"
+     ]
+    }
+   ],
+   "source": [
+    "%%bash\n",
+    "python3 -m pip install justuse"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:08:37.099787Z",
+     "iopub.status.busy": "2022-03-29T17:08:37.099429Z",
+     "iopub.status.idle": "2022-03-29T17:08:38.078322Z",
+     "shell.execute_reply": "2022-03-29T17:08:38.075868Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:37.099752Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "import use"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:08:38.086978Z",
+     "iopub.status.busy": "2022-03-29T17:08:38.086122Z",
+     "iopub.status.idle": "2022-03-29T17:08:38.122451Z",
+     "shell.execute_reply": "2022-03-29T17:08:38.121332Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:38.086872Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "0.7.5\n"
+     ]
+    }
+   ],
+   "source": [
+    "use.__version__"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2021-11-22T22:33:53.303316Z",
+     "iopub.status.busy": "2021-11-22T22:33:53.302686Z",
+     "iopub.status.idle": "2021-11-22T22:33:53.308157Z",
+     "shell.execute_reply": "2021-11-22T22:33:53.306483Z",
+     "shell.execute_reply.started": "2021-11-22T22:33:53.303275Z"
+    }
+   },
+   "source": [
+    "## Basic Usage"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Let's start with a simple case"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:08:38.124889Z",
+     "iopub.status.busy": "2022-03-29T17:08:38.124471Z",
+     "iopub.status.idle": "2022-03-29T17:08:38.389503Z",
+     "shell.execute_reply": "2022-03-29T17:08:38.387990Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:38.124844Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.main\u001b[1;30m: \u001b[0mcase = (False, False, True, False)\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.buffet_old\u001b[1;30m: \u001b[0mresult = <module 'math' from '/home/thorsten/anaconda3/lib/python3.8/lib-dynload/math.cpython-38-x86_64-linux-gnu.so'>\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "-0.5328330203333975"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "use(\"math\").cos(23)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Here we loaded math but without adding it to the global namespace, so if you only need one thing from a module or package, you don't have to pollute your namespace."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2021-11-22T19:32:29.373810Z",
+     "iopub.status.busy": "2021-11-22T19:32:29.373320Z",
+     "iopub.status.idle": "2021-11-22T19:32:29.383680Z",
+     "shell.execute_reply": "2021-11-22T19:32:29.382305Z",
+     "shell.execute_reply.started": "2021-11-22T19:32:29.373772Z"
+    }
+   },
+   "source": [
+    "Installing something could be inconvenient or unnecessary if something else is available - or we want to include some minimal functionality in our program and only fetch additional dependencies only under certain conditions."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The common approach would be something like"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:08:38.391816Z",
+     "iopub.status.busy": "2022-03-29T17:08:38.391418Z",
+     "iopub.status.idle": "2022-03-29T17:08:38.401440Z",
+     "shell.execute_reply": "2022-03-29T17:08:38.399907Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:38.391768Z"
+    },
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "try:\n",
+    "    import some_big_package\n",
+    "except ImportError:\n",
+    "    some_big_package = None\n",
+    "if some_big_package:\n",
+    "    ..."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2021-11-22T19:57:09.320535Z",
+     "iopub.status.busy": "2021-11-22T19:57:09.319761Z",
+     "iopub.status.idle": "2021-11-22T19:57:09.328957Z",
+     "shell.execute_reply": "2021-11-22T19:57:09.327576Z",
+     "shell.execute_reply.started": "2021-11-22T19:57:09.320488Z"
+    }
+   },
+   "source": [
+    "which is unnecessarily cumbersome - couldn't we simply have a default like in so many other functions that is returned instead of raising an exception? Of course we can!"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Here's a metaphor from *The Matrix*:\n",
+    "[![Matrix - Skill Upload](https://img.youtube.com/vi/w_8NsPQBdV0/0.jpg)](https://www.youtube.com/watch?v=w_8NsPQBdV0)\n",
+    "\n",
+    "Imagine you want to streamline the user experience by distributing a very minimal, \"free\" but fully functional software to your end users which installs within seconds. Now, whenever the user wants to use a premium feature (or simply a feature that isn't generally required by the majority of users, therefor not included in the basic installation) the program could use() the packages and modules needed to realise the feature to download and install in the background while the user can still use other stuff, then trigger a callback when use() is done loading. The experience would be similar to playing an open world game which seamlessly downloads and loads new areas in the background on demand, without hiccup or loading screens. Or like Neo and Trinity - just get the skills to pilot a helicopter when you need them, right there on the spot. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:08:38.404522Z",
+     "iopub.status.busy": "2022-03-29T17:08:38.403910Z",
+     "iopub.status.idle": "2022-03-29T17:08:38.463275Z",
+     "shell.execute_reply": "2022-03-29T17:08:38.461173Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:38.404444Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.main\u001b[1;30m: \u001b[0mcase = (False, False, False, False)\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.buffet_old\u001b[1;30m: \u001b[0mresult = ImportError('No pkg installed named some_big_package and auto-installation not requested. Aborting.')\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "I'm going to learn Ju-Jutsu?\n"
+     ]
+    }
+   ],
+   "source": [
+    "pkg = use(\"some_big_package\", default=None)\n",
+    "if not pkg:\n",
+    "    print(\"I'm going to learn Ju-Jutsu?\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2021-11-22T19:58:53.761253Z",
+     "iopub.status.busy": "2021-11-22T19:58:53.760790Z",
+     "iopub.status.idle": "2021-11-22T19:58:53.768580Z",
+     "shell.execute_reply": "2021-11-22T19:58:53.767072Z",
+     "shell.execute_reply.started": "2021-11-22T19:58:53.761215Z"
+    }
+   },
+   "source": [
+    "Even more concise (python >3.9):"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:08:38.465395Z",
+     "iopub.status.busy": "2022-03-29T17:08:38.464921Z",
+     "iopub.status.idle": "2022-03-29T17:08:38.840734Z",
+     "shell.execute_reply": "2022-03-29T17:08:38.839824Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:38.465313Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.main\u001b[1;30m: \u001b[0mcase = (False, False, True, False)\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.buffet_old\u001b[1;30m: \u001b[0mresult = <module 'pytest' from '/home/thorsten/anaconda3/lib/python3.8/site-packages/pytest/__init__.py'>\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "I know Kung Fu!\n"
+     ]
+    }
+   ],
+   "source": [
+    "if (pkg := use(\"pytest\", default=None)):\n",
+    "    print(\"I know Kung Fu!\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "It is also possible to lazily chain use() calls with defaults like\n",
+    "\n",
+    "> math = use(\"numpy\", default=None) or use(\"math\")\n",
+    "\n",
+    "which will evaluate from left to right and return whichever call returns something truthy (like a viable module) first."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "One of the most practical use()s is making sure we imported the expected version of a certain package. This is especially important in research papers, notebooks and other publications because those often don't come with a `requirements.txt` and there is no way to make sure you are actually running the published code with the same versions as the author.\n",
+    "Also, if you pip-install something, it can happen that it upgrades a dependency, accidentally breaking code that requires the old version - with pip you *can't have more than one version installed*. With justuse any number of versions can be installed in parallel, without interfering with anything that was installed globally via pip, conda etc."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:08:38.842445Z",
+     "iopub.status.busy": "2022-03-29T17:08:38.842158Z",
+     "iopub.status.idle": "2022-03-29T17:08:39.049843Z",
+     "shell.execute_reply": "2022-03-29T17:08:39.048869Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:38.842411Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.main\u001b[1;30m: \u001b[0mcase = (True, False, True, False)\n",
+      "/home/thorsten/anaconda3/lib/python3.8/site-packages/use/pimp.py:87: VersionWarning: numpy expected to be version 2022, but got 1.21.2 instead\n",
+      "  warn(UserMessage.version_warning(name, version, result_version), category=VersionWarning)\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.buffet_old\u001b[1;30m: \u001b[0mresult = <module 'numpy' from '/home/thorsten/anaconda3/lib/python3.8/site-packages/numpy/__init__.py'>\n"
+     ]
+    }
+   ],
+   "source": [
+    "np = use(\"numpy\", version=\"2022\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:08:39.051461Z",
+     "iopub.status.busy": "2022-03-29T17:08:39.051169Z",
+     "iopub.status.idle": "2022-03-29T17:08:39.064756Z",
+     "shell.execute_reply": "2022-03-29T17:08:39.063369Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:39.051427Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'1.21.2'"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "np.__version__"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Here you see that even though we got a warning about the wrong version, we still get the requested package, just giving you a heads up about a possibly problematic situation without standing in the way."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Let's try another one!"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:08:39.066211Z",
+     "iopub.status.busy": "2022-03-29T17:08:39.065926Z",
+     "iopub.status.idle": "2022-03-29T17:08:39.149730Z",
+     "shell.execute_reply": "2022-03-29T17:08:39.146239Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:39.066177Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.main\u001b[1;30m: \u001b[0mcase = (False, False, False, False)\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.buffet_old\u001b[1;30m: \u001b[0mresult = ImportError('No pkg installed named pygame and auto-installation not requested. Aborting.')\n"
+     ]
+    },
+    {
+     "ename": "ImportError",
+     "evalue": "No pkg installed named pygame and auto-installation not requested. Aborting.",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[0;31mImportError\u001b[0m                               Traceback (most recent call last)",
+      "\u001b[0;32m/tmp/ipykernel_3329/217604034.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mpg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0muse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"pygame\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m    128\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    129\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__condition\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 130\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__implementation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    131\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    132\u001b[0m     \u001b[0;31m# to allow `numpy @ use` for a quick check\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/tools.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m     44\u001b[0m                 \u001b[0;32mraise\u001b[0m \u001b[0mNirvanaWarning\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"No use trying to use Nothing.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     45\u001b[0m             \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 46\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mdispatcher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdispatch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     47\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     48\u001b[0m     \u001b[0mwrapper\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregister\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdispatcher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregister\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_str\u001b[0;34m(self, name, version, hash_algo, hashes, default, modes)\u001b[0m\n\u001b[1;32m    723\u001b[0m         \"\"\"\n\u001b[1;32m    724\u001b[0m         \u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodule_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_parse_name\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 725\u001b[0;31m         return self._use_package(\n\u001b[0m\u001b[1;32m    726\u001b[0m             \u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    727\u001b[0m             \u001b[0mpackage_name\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/icontract/_checkers.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    639\u001b[0m                 \u001b[0;31m# Unfortunately, this can not be done in Python 3, see\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    640\u001b[0m                 \u001b[0;31m# https://stackoverflow.com/questions/44813333/how-can-i-elide-a-function-wrapper-from-the-traceback-in-python-3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 641\u001b[0;31m                 \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    642\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    643\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0mpostconditions\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_package\u001b[0;34m(self, name, package_name, module_name, version, hashes, default, hash_algo, modes, Message)\u001b[0m\n\u001b[1;32m    807\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    808\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 809\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0m_fail_or_default\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    810\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    811\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mModuleType\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/pimp.py\u001b[0m in \u001b[0;36m_fail_or_default\u001b[0;34m(exception, default)\u001b[0m\n\u001b[1;32m    955\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    956\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 957\u001b[0;31m         \u001b[0;32mraise\u001b[0m \u001b[0mexception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    958\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    959\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;31mImportError\u001b[0m: No pkg installed named pygame and auto-installation not requested. Aborting."
+     ]
+    }
+   ],
+   "source": [
+    "pg = use(\"pygame\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Well, bummer! We want to play with pygame, let's have pygame!"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:08:47.932063Z",
+     "iopub.status.busy": "2022-03-29T17:08:47.931709Z",
+     "iopub.status.idle": "2022-03-29T17:08:50.952098Z",
+     "shell.execute_reply": "2022-03-29T17:08:50.950268Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:47.932025Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.main\u001b[1;30m: \u001b[0mcase = (False, False, False, True)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "2.1.3.dev4\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.buffet_old\u001b[1;30m: \u001b[0mresult = RuntimeWarning('Please specify version and hash for auto-installation of \\'pygame\\'.\\nA webbrowser should open to the Snyk Advisor to check whether the package is vulnerable or malicious.\\nIf you want to auto-install the latest version, try the following line to select all viable hashes:\\nuse(\"pygame\", version=\"2.1.3.dev4\", modes=use.auto_install)')\n"
+     ]
+    },
+    {
+     "ename": "RuntimeWarning",
+     "evalue": "Please specify version and hash for auto-installation of 'pygame'.\nA webbrowser should open to the Snyk Advisor to check whether the package is vulnerable or malicious.\nIf you want to auto-install the latest version, try the following line to select all viable hashes:\nuse(\"pygame\", version=\"2.1.3.dev4\", modes=use.auto_install)",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[0;31mRuntimeWarning\u001b[0m                            Traceback (most recent call last)",
+      "\u001b[0;32m/tmp/ipykernel_3329/1145780527.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mpg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0muse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"pygame\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodes\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0muse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mauto_install\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m    128\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    129\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__condition\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 130\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__implementation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    131\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    132\u001b[0m     \u001b[0;31m# to allow `numpy @ use` for a quick check\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/tools.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m     44\u001b[0m                 \u001b[0;32mraise\u001b[0m \u001b[0mNirvanaWarning\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"No use trying to use Nothing.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     45\u001b[0m             \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 46\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mdispatcher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdispatch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     47\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     48\u001b[0m     \u001b[0mwrapper\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregister\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdispatcher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregister\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_str\u001b[0;34m(self, name, version, hash_algo, hashes, default, modes)\u001b[0m\n\u001b[1;32m    723\u001b[0m         \"\"\"\n\u001b[1;32m    724\u001b[0m         \u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodule_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_parse_name\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 725\u001b[0;31m         return self._use_package(\n\u001b[0m\u001b[1;32m    726\u001b[0m             \u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    727\u001b[0m             \u001b[0mpackage_name\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/icontract/_checkers.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    639\u001b[0m                 \u001b[0;31m# Unfortunately, this can not be done in Python 3, see\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    640\u001b[0m                 \u001b[0;31m# https://stackoverflow.com/questions/44813333/how-can-i-elide-a-function-wrapper-from-the-traceback-in-python-3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 641\u001b[0;31m                 \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    642\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    643\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0mpostconditions\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_package\u001b[0;34m(self, name, package_name, module_name, version, hashes, default, hash_algo, modes, Message)\u001b[0m\n\u001b[1;32m    807\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    808\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 809\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0m_fail_or_default\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    810\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    811\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mModuleType\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/pimp.py\u001b[0m in \u001b[0;36m_fail_or_default\u001b[0;34m(exception, default)\u001b[0m\n\u001b[1;32m    955\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    956\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 957\u001b[0;31m         \u001b[0;32mraise\u001b[0m \u001b[0mexception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    958\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    959\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;31mRuntimeWarning\u001b[0m: Please specify version and hash for auto-installation of 'pygame'.\nA webbrowser should open to the Snyk Advisor to check whether the package is vulnerable or malicious.\nIf you want to auto-install the latest version, try the following line to select all viable hashes:\nuse(\"pygame\", version=\"2.1.3.dev4\", modes=use.auto_install)"
+     ]
+    }
+   ],
+   "source": [
+    "pg = use(\"pygame\", modes=use.auto_install)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Now we're getting somewhere! Hmm.. it says \"To get some valuable insight on the health of this package, please check out https://snyk.io/advisor/python/pygame - see for yourself!"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Let's look at this last line of the message.. hmm.. a dev version? Nah, let's pick the last stable version instead."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:08:59.641601Z",
+     "iopub.status.busy": "2022-03-29T17:08:59.640706Z",
+     "iopub.status.idle": "2022-03-29T17:08:59.649621Z",
+     "shell.execute_reply": "2022-03-29T17:08:59.648519Z",
+     "shell.execute_reply.started": "2022-03-29T17:08:59.641556Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Linux 5.4.0-105-generic \n",
+      " 3.8.5\n"
+     ]
+    }
+   ],
+   "source": [
+    "import platform; print(platform.system(), platform.release(), \"\\n\", platform.python_version())"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:09:00.912046Z",
+     "iopub.status.busy": "2022-03-29T17:09:00.911204Z",
+     "iopub.status.idle": "2022-03-29T17:09:02.311836Z",
+     "shell.execute_reply": "2022-03-29T17:09:02.308668Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:00.912003Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.main\u001b[1;30m: \u001b[0mcase = (True, False, False, True)\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.buffet_old\u001b[1;30m: \u001b[0mresult = RuntimeWarning('Failed to auto-install \\'pygame\\' because hashes aren\\'t specified.\\n        A webbrowser should open with a list of available hashes for different platforms for you to pick.\"\\n        If you want to use the package only on this platform, this should work:\\n    use(\"pygame\", version=\"2.1.2\", hashes=\\'V蘕驈詋光釠軫鳌铎縵䁄鉠龔嵚匟䍶癦㣠\\', modes=use.auto_install)')\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "V蘕驈詋光釠軫鳌铎縵䁄鉠龔嵚匟䍶癦㣠\n"
+     ]
+    },
+    {
+     "ename": "RuntimeWarning",
+     "evalue": "Failed to auto-install 'pygame' because hashes aren't specified.\n        A webbrowser should open with a list of available hashes for different platforms for you to pick.\"\n        If you want to use the package only on this platform, this should work:\n    use(\"pygame\", version=\"2.1.2\", hashes='V蘕驈詋光釠軫鳌铎縵䁄鉠龔嵚匟䍶癦㣠', modes=use.auto_install)",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[0;31mRuntimeWarning\u001b[0m                            Traceback (most recent call last)",
+      "\u001b[0;32m/tmp/ipykernel_3329/1367005035.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0muse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"pygame\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mversion\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"2.1.2\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodes\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0muse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mauto_install\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m    128\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    129\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__condition\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 130\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__implementation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    131\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    132\u001b[0m     \u001b[0;31m# to allow `numpy @ use` for a quick check\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/tools.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m     44\u001b[0m                 \u001b[0;32mraise\u001b[0m \u001b[0mNirvanaWarning\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"No use trying to use Nothing.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     45\u001b[0m             \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 46\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mdispatcher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdispatch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     47\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     48\u001b[0m     \u001b[0mwrapper\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregister\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdispatcher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregister\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_str\u001b[0;34m(self, name, version, hash_algo, hashes, default, modes)\u001b[0m\n\u001b[1;32m    723\u001b[0m         \"\"\"\n\u001b[1;32m    724\u001b[0m         \u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodule_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_parse_name\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 725\u001b[0;31m         return self._use_package(\n\u001b[0m\u001b[1;32m    726\u001b[0m             \u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    727\u001b[0m             \u001b[0mpackage_name\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpackage_name\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/icontract/_checkers.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    639\u001b[0m                 \u001b[0;31m# Unfortunately, this can not be done in Python 3, see\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    640\u001b[0m                 \u001b[0;31m# https://stackoverflow.com/questions/44813333/how-can-i-elide-a-function-wrapper-from-the-traceback-in-python-3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 641\u001b[0;31m                 \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    642\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    643\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0mpostconditions\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/main.py\u001b[0m in \u001b[0;36m_use_package\u001b[0;34m(self, name, package_name, module_name, version, hashes, default, hash_algo, modes, Message)\u001b[0m\n\u001b[1;32m    807\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    808\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 809\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0m_fail_or_default\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    810\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    811\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mModuleType\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/pimp.py\u001b[0m in \u001b[0;36m_fail_or_default\u001b[0;34m(exception, default)\u001b[0m\n\u001b[1;32m    955\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    956\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 957\u001b[0;31m         \u001b[0;32mraise\u001b[0m \u001b[0mexception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    958\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    959\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;31mRuntimeWarning\u001b[0m: Failed to auto-install 'pygame' because hashes aren't specified.\n        A webbrowser should open with a list of available hashes for different platforms for you to pick.\"\n        If you want to use the package only on this platform, this should work:\n    use(\"pygame\", version=\"2.1.2\", hashes='V蘕驈詋光釠軫鳌铎縵䁄鉠龔嵚匟䍶癦㣠', modes=use.auto_install)"
+     ]
+    }
+   ],
+   "source": [
+    "use(\"pygame\", version=\"2.1.2\", modes=use.auto_install)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Hey, did you see the browser tab that just opened? You can select all the platforms and python versions you want to support there and just copy & paste the snippet - let's get the one for python 3.8 and ubuntu I'm running here.."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2021-11-23T20:24:34.295653Z",
+     "iopub.status.busy": "2021-11-23T20:24:34.294878Z",
+     "iopub.status.idle": "2021-11-23T20:24:34.314741Z",
+     "shell.execute_reply": "2021-11-23T20:24:34.312597Z",
+     "shell.execute_reply.started": "2021-11-23T20:24:34.295588Z"
+    }
+   },
+   "source": [
+    "You wonder what those chinese looking characters are? Well. Normally, hexdigests look something like `d6c1c1c53a988b3daf44c1865d40f86de48665639bfbd5eea1317eb083638a3a` which is way too verbose on a normal line of code and since you shouldn't manually type those anyway but only copy&paste, we thought what the heck - let's use the japanese, ascii, chinese and korean alphabets (thus JACK) to encode those hashes as compact as we can."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Well, let's try to use all the linux ones for py38 - copy&paste.."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:09:10.739111Z",
+     "iopub.status.busy": "2022-03-29T17:09:10.738727Z",
+     "iopub.status.idle": "2022-03-29T17:09:27.819663Z",
+     "shell.execute_reply": "2022-03-29T17:09:27.818176Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:10.739072Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.main\u001b[1;30m: \u001b[0mcase = (True, True, False, True)\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mAttempting auto-installation of <1219a963941bd53aa754e8449364c142004fe706c33a9c22ff2a76521a82d078>...\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mDownloading artifact from PyPI...\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mDownload successful.\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mAttempting to install..\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Using pip 21.2.4 from /home/thorsten/anaconda3/lib/python3.8/site-packages/pip (python 3.8)\n",
+      "Non-user install due to --prefix or --target option\n",
+      "Created temporary directory: /tmp/pip-ephem-wheel-cache-2jr7tl_n\n",
+      "Created temporary directory: /tmp/pip-req-tracker-1n7fx1dn\n",
+      "Initialized build tracking at /tmp/pip-req-tracker-1n7fx1dn\n",
+      "Created build tracker: /tmp/pip-req-tracker-1n7fx1dn\n",
+      "Entered build tracker: /tmp/pip-req-tracker-1n7fx1dn\n",
+      "Created temporary directory: /tmp/pip-install-x1k3385k\n",
+      "Processing /home/thorsten/.justuse-python/packages/pygame-2.1.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl\n",
+      "  Added pygame==2.1.2 from file:///home/thorsten/.justuse-python/packages/pygame-2.1.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl to build tracker '/tmp/pip-req-tracker-1n7fx1dn'\n",
+      "  Removed pygame==2.1.2 from file:///home/thorsten/.justuse-python/packages/pygame-2.1.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl from build tracker '/tmp/pip-req-tracker-1n7fx1dn'\n",
+      "Created temporary directory: /tmp/pip-unpack-na9sd2b7\n",
+      "Installing collected packages: pygame\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mInstallation successful.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\n",
+      "Successfully installed pygame-2.1.2\n",
+      "Removed build tracker: '/tmp/pip-req-tracker-1n7fx1dn'\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mdist=<importlib_metadata.PathDistribution object at 0x7f53729300a0>\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mAttempting to import...\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mSuccessfully imported.\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.buffet_old\u001b[1;30m: \u001b[0mresult = <module 'pygame' from '/home/thorsten/.justuse-python/venv/pygame/2.1.2/lib/python3.8/site-packages/pygame/__init__.py'>\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "pygame 2.1.2 (SDL 2.0.16, Python 3.8.5)\n",
+      "Hello from the pygame community. https://www.pygame.org/contribute.html\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "<module 'pygame' from '/home/thorsten/.justuse-python/venv/pygame/2.1.2/lib/python3.8/site-packages/pygame/__init__.py'>"
+      ]
+     },
+     "execution_count": 14,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "use('pygame', version='2.1.2', modes=use.auto_install, hash_algo=use.Hash.sha256, hashes={\n",
+    "    '1219a963941bd53aa754e8449364c142004fe706c33a9c22ff2a76521a82d078',  # cp38-manylinux_2_12_x86_64.manylinux2010_x86_64\n",
+    "    'ea36f4f93524554a35cac2359df63b50af6556ed866830aa1f07f0d8580280ea',  # cp38-manylinux_2_5_x86_64.manylinux1_x86_64\n",
+    "    '97a74ba186deee68318a52637012ef6abf5be6282c659e1d1ba6ad08cf35ec85',  # cp38-manylinux_2_17_x86_64.manylinux2014_x86_64 \n",
+    "})"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2021-11-22T18:09:18.480558Z",
+     "iopub.status.busy": "2021-11-22T18:09:18.479870Z",
+     "iopub.status.idle": "2021-11-22T18:09:18.495532Z",
+     "shell.execute_reply": "2021-11-22T18:09:18.492594Z",
+     "shell.execute_reply.started": "2021-11-22T18:09:18.480515Z"
+    }
+   },
+   "source": [
+    "Wow, did we just download, install and load the pygame package without leaving our own sweet code?? Yes, we did!"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2021-11-22T18:13:38.832767Z",
+     "iopub.status.busy": "2021-11-22T18:13:38.832002Z",
+     "iopub.status.idle": "2021-11-22T18:13:38.847351Z",
+     "shell.execute_reply": "2021-11-22T18:13:38.844955Z",
+     "shell.execute_reply.started": "2021-11-22T18:13:38.832713Z"
+    }
+   },
+   "source": [
+    "Furthermore, the package we installed is version and hash-pinned so we really only get what we asked for and nothing else."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "There's a small problem though. Those hashes refer to very specific files and some of those packages may be written in C or even Fortran (like numpy) that are compiled for specific platforms.\n",
+    "If you happily develop code on Linux that uses something platform-specific (like numpy!) it will all work without problems - until you try to run your code on another platform. In this case, you need to specify all hashes for all platforms you want to run your code on."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Version- and hash-pinning is the most secure way to install a package. It will ensure that your code will always run as you expect it, but there's a drawback: there is no immediate and automatic way to update code without involving the user (yet). On one side, you won't ever accidentally break your stuff by updating something else, but you also won't benefit from automatic security patches. To fix this shortcoming, it might be feasible to build IDE-plugins that check and update these pins in the code or check some database for security patches every time an auto-installed package is imported - please contact us if you have ideas or better yet, code ;-)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Use() modules from anywhere!\n",
+    "If you `import` some package or module, you're limited to the stuff you have in your current directory or below (but only if there is a `__init__.py` or if it's an implicit namespace package) and the things in your sys.path, which can be manipulated freely, making it very complicated to handle. Let's suppose we're in our test directory."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:09:37.523441Z",
+     "iopub.status.busy": "2022-03-29T17:09:37.523070Z",
+     "iopub.status.idle": "2022-03-29T17:09:37.537150Z",
+     "shell.execute_reply": "2022-03-29T17:09:37.536156Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:37.523398Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "/media/sf_Dropbox/code/justuse/tests\n"
+     ]
+    }
+   ],
+   "source": [
+    "%cd ~/Desktop/sf_Dropbox/code/justuse/tests"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "the code we want to run is in justuse/docs and there is no `__init__.py` in between, so to get to run the code, we could put the src directory in sys.path - or we could use() a module directly!"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:09:39.008242Z",
+     "iopub.status.busy": "2022-03-29T17:09:39.007877Z",
+     "iopub.status.idle": "2022-03-29T17:09:39.022433Z",
+     "shell.execute_reply": "2022-03-29T17:09:39.021387Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:39.008204Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mPath.cwd()=PosixPath('/media/sf_Dropbox/code/justuse/docs') package_name='' module_name='demo' module_path=PosixPath('/media/sf_Dropbox/code/justuse/docs/demo.py')\n"
+     ]
+    }
+   ],
+   "source": [
+    "mod = use(use.Path(\"../docs/demo.py\"))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:09:40.235932Z",
+     "iopub.status.busy": "2022-03-29T17:09:40.235520Z",
+     "iopub.status.idle": "2022-03-29T17:09:40.241824Z",
+     "shell.execute_reply": "2022-03-29T17:09:40.240800Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:40.235896Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Hello justuse-user!\n"
+     ]
+    }
+   ],
+   "source": [
+    "mod.foo()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Loading single modules doesn't sound like much, but especially while experimenting on jupyter, this can be used very effectively in conjunction with the reloading mode:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:09:42.934273Z",
+     "iopub.status.busy": "2022-03-29T17:09:42.933820Z",
+     "iopub.status.idle": "2022-03-29T17:09:42.959816Z",
+     "shell.execute_reply": "2022-03-29T17:09:42.958503Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:42.934219Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mPath.cwd()=PosixPath('/media/sf_Dropbox/code/justuse/docs') package_name='' module_name='demo' module_path=PosixPath('/media/sf_Dropbox/code/justuse/docs/demo.py')\n"
+     ]
+    }
+   ],
+   "source": [
+    "mod = use(use.Path(\"../docs/demo.py\"), modes=use.reloading)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Now this module is loaded fresh whenever you modify and save the file, replacing the implementation behind the scene. This will work without any problems as long as you put functions in that module and if you access those functions via attribute-access (`mod.func()` **not** `func = mod.func; func()`)."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2021-11-23T00:11:22.768463Z",
+     "iopub.status.busy": "2021-11-23T00:11:22.767536Z",
+     "iopub.status.idle": "2021-11-23T00:11:22.781007Z",
+     "shell.execute_reply": "2021-11-23T00:11:22.779348Z",
+     "shell.execute_reply.started": "2021-11-23T00:11:22.768380Z"
+    }
+   },
+   "source": [
+    "If you can load modules from disk, why couldn't you load them from the web? Let's say you found an interesting github repo like https://github.com/amogorkon/justuse. Chances are, there's also a package on pypi you can pip-install, but maybe there's not. Maybe you're only interested in a single module from that repo/package, so you don't even want to install anything. Then you could download it from github, move the file manually into your folder and import it - sounds like a lot of trouble for a single module!\n",
+    "There has to be a better way! And there is - you can just use() web resources:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 19,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:09:44.362039Z",
+     "iopub.status.busy": "2022-03-29T17:09:44.361536Z",
+     "iopub.status.idle": "2022-03-29T17:09:44.692046Z",
+     "shell.execute_reply": "2022-03-29T17:09:44.690576Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:44.361996Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/home/thorsten/anaconda3/lib/python3.8/site-packages/use/main.py:399: NoValidationWarning: Attempting to import from the interwebs with no validation whatsoever!\n",
+      "To safely reproduce:\n",
+      "use(use.URL('https://raw.githubusercontent.com/amogorkon/justuse/unstable/docs/demo.py'), hash_algo=use.Hash.sha256, hash_value='59eff31bb220ce933ccc083b9306020ec25d19d43de30e5ad4341b355d4b48bf')\n",
+      "  warn(UserMessage.no_validation(url, hash_algo, this_hash), NoValidationWarning)\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mPath.cwd()=PosixPath('/media/sf_Dropbox/code/justuse/tests') package_name='' module_name='demo.py' module_path=PosixPath('/media/sf_Dropbox/code/justuse/tests/amogorkon/justuse/unstable/docs/demo.py')\n"
+     ]
+    }
+   ],
+   "source": [
+    "mod = use(use.URL(\"https://raw.githubusercontent.com/amogorkon/justuse/unstable/docs/demo.py\"))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2021-11-23T00:17:40.146456Z",
+     "iopub.status.busy": "2021-11-23T00:17:40.145947Z",
+     "iopub.status.idle": "2021-11-23T00:17:40.155091Z",
+     "shell.execute_reply": "2021-11-23T00:17:40.153301Z",
+     "shell.execute_reply.started": "2021-11-23T00:17:40.146414Z"
+    }
+   },
+   "source": [
+    "copy&paste that line from the exception to get that sweet hash.."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:09:49.144653Z",
+     "iopub.status.busy": "2022-03-29T17:09:49.143622Z",
+     "iopub.status.idle": "2022-03-29T17:09:49.226852Z",
+     "shell.execute_reply": "2022-03-29T17:09:49.225797Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:49.144608Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mPath.cwd()=PosixPath('/media/sf_Dropbox/code/justuse/tests') package_name='' module_name='demo.py' module_path=PosixPath('/media/sf_Dropbox/code/justuse/tests/amogorkon/justuse/unstable/docs/demo.py')\n"
+     ]
+    }
+   ],
+   "source": [
+    "mod = use(use.URL('https://raw.githubusercontent.com/amogorkon/justuse/unstable/docs/demo.py'), hash_algo=use.Hash.sha256, hash_value='59eff31bb220ce933ccc083b9306020ec25d19d43de30e5ad4341b355d4b48bf')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 21,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:09:51.395045Z",
+     "iopub.status.busy": "2022-03-29T17:09:51.394084Z",
+     "iopub.status.idle": "2022-03-29T17:09:51.401257Z",
+     "shell.execute_reply": "2022-03-29T17:09:51.400030Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:51.395015Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Hello justuse-user!\n"
+     ]
+    }
+   ],
+   "source": [
+    "mod.foo()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Since the content of this file is now hash-pinned, it doesn't matter whether or not someone hacks github and changes the code - justuse will instantly notice before executing any code. You can even execute code directly from pastebin or any other untrusted, public platform - as long as you have the proper hash, you're safe."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## A word on circular imports\n",
+    "Everyone stumbles over a circular import once they try to build slightly more complex projects and it can get very ugly and overly frustrating to deal with those.\n",
+    "\n",
+    "Let's suppose we have two modules A and B:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 22,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:09:53.149046Z",
+     "iopub.status.busy": "2022-03-29T17:09:53.147915Z",
+     "iopub.status.idle": "2022-03-29T17:09:53.288414Z",
+     "shell.execute_reply": "2022-03-29T17:09:53.287384Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:53.149003Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "/media/sf_Dropbox/code/justuse/docs\n",
+      "insgesamt 47\n",
+      "-rwxrwx--- 1 root  2356 Mär 24 11:29  \u001b[0m\u001b[01;32mcodeflow.md\u001b[0m*\n",
+      "-rwxrwx--- 1 root  1326 Mär 24 11:29 \u001b[01;32m'database schema.md'\u001b[0m*\n",
+      "-rwxrwx--- 1 root    43 Feb 16 11:35  \u001b[01;32mdemo.py\u001b[0m*\n",
+      "-rwxrwx--- 1 root    97 Feb 16 11:35  \u001b[01;32mmodule_a.py\u001b[0m*\n",
+      "-rwxrwx--- 1 root    47 Feb 16 11:35  \u001b[01;32mmodule_b.py\u001b[0m*\n",
+      "-rwxrwx--- 1 root    62 Feb 16 11:35  \u001b[01;32mmodule_circular_a.py\u001b[0m*\n",
+      "-rwxrwx--- 1 root    68 Feb 16 11:35  \u001b[01;32mmodule_circular_b.py\u001b[0m*\n",
+      "drwxrwx--- 1 root     0 Mär 29 18:06  \u001b[01;34m__pycache__\u001b[0m/\n",
+      "-rwxrwx--- 1 root 74015 Mär 29 19:09  \u001b[01;32mShowcase.ipynb\u001b[0m*\n"
+     ]
+    }
+   ],
+   "source": [
+    "%cd ../docs\n",
+    "%ll"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 23,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:09:56.211386Z",
+     "iopub.status.busy": "2022-03-29T17:09:56.210155Z",
+     "iopub.status.idle": "2022-03-29T17:09:56.221247Z",
+     "shell.execute_reply": "2022-03-29T17:09:56.220253Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:56.211338Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "\u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Hello from A!\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n",
+       "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n",
+       "\u001b[0;34m\u001b[0m\u001b[0;32mimport\u001b[0m \u001b[0mmodule_circular_b\u001b[0m\u001b[0;34m\u001b[0m\n",
+       "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n",
+       "\u001b[0;34m\u001b[0m\u001b[0mfoo\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m23\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "%less module_circular_a.py"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 24,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:09:57.040251Z",
+     "iopub.status.busy": "2022-03-29T17:09:57.039433Z",
+     "iopub.status.idle": "2022-03-29T17:09:57.047982Z",
+     "shell.execute_reply": "2022-03-29T17:09:57.046971Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:57.040210Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "\u001b[0;34m\u001b[0m\n",
+       "\u001b[0;34m\u001b[0m\u001b[0;32mfrom\u001b[0m \u001b[0mmodule_circular_a\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mfoo\u001b[0m\u001b[0;34m\u001b[0m\n",
+       "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n",
+       "\u001b[0;34m\u001b[0m\u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Hello from B!\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfoo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "%less module_circular_b.py"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:09:57.912191Z",
+     "iopub.status.busy": "2022-03-29T17:09:57.911299Z",
+     "iopub.status.idle": "2022-03-29T17:09:57.973617Z",
+     "shell.execute_reply": "2022-03-29T17:09:57.970810Z",
+     "shell.execute_reply.started": "2022-03-29T17:09:57.912143Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Hello from A!\n"
+     ]
+    },
+    {
+     "ename": "ImportError",
+     "evalue": "cannot import name 'foo' from partially initialized module 'module_circular_a' (most likely due to a circular import) (/media/sf_Dropbox/code/justuse/docs/module_circular_a.py)",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[0;31mImportError\u001b[0m                               Traceback (most recent call last)",
+      "\u001b[0;32m/tmp/ipykernel_3329/2853914029.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mmodule_circular_a\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[0;32m/media/sf_Dropbox/code/justuse/docs/module_circular_a.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Hello from A!\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mmodule_circular_b\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0mfoo\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m23\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m/media/sf_Dropbox/code/justuse/docs/module_circular_b.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mmodule_circular_a\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mfoo\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Hello from B!\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfoo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;31mImportError\u001b[0m: cannot import name 'foo' from partially initialized module 'module_circular_a' (most likely due to a circular import) (/media/sf_Dropbox/code/justuse/docs/module_circular_a.py)"
+     ]
+    }
+   ],
+   "source": [
+    "import module_circular_a"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 26,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:10:00.083951Z",
+     "iopub.status.busy": "2022-03-29T17:10:00.083080Z",
+     "iopub.status.idle": "2022-03-29T17:10:00.092100Z",
+     "shell.execute_reply": "2022-03-29T17:10:00.091117Z",
+     "shell.execute_reply.started": "2022-03-29T17:10:00.083921Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "\u001b[0;32mimport\u001b[0m \u001b[0muse\u001b[0m\u001b[0;34m\u001b[0m\n",
+       "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n",
+       "\u001b[0;34m\u001b[0m\u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Hello from A!\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n",
+       "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n",
+       "\u001b[0;34m\u001b[0m\u001b[0muse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mPath\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"module_b.py\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minitial_globals\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m\"foo\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m23\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "%less module_a.py"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 27,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:10:01.836206Z",
+     "iopub.status.busy": "2022-03-29T17:10:01.835205Z",
+     "iopub.status.idle": "2022-03-29T17:10:03.818776Z",
+     "shell.execute_reply": "2022-03-29T17:10:03.817885Z",
+     "shell.execute_reply.started": "2022-03-29T17:10:01.836163Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "\u001b[0mfoo\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m\u001b[0m\n",
+       "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n",
+       "\u001b[0;34m\u001b[0m\u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"Hello from B! foo={foo}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "%less module_b.py"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 28,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:10:03.822150Z",
+     "iopub.status.busy": "2022-03-29T17:10:03.820565Z",
+     "iopub.status.idle": "2022-03-29T17:10:09.823025Z",
+     "shell.execute_reply": "2022-03-29T17:10:09.821773Z",
+     "shell.execute_reply.started": "2022-03-29T17:10:03.822108Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mPath.cwd()=PosixPath('/media/sf_Dropbox/code/justuse/docs') package_name='' module_name='module_a' module_path=PosixPath('/media/sf_Dropbox/code/justuse/docs/module_a.py')\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.pimp\u001b[1;30m: \u001b[0mPath.cwd()=PosixPath('/media/sf_Dropbox/code/justuse/docs') package_name='' module_name='module_b' module_path=PosixPath('/media/sf_Dropbox/code/justuse/docs/module_b.py')\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Hello from A!\n",
+      "Hello from B! foo=23\n"
+     ]
+    }
+   ],
+   "source": [
+    "modA = use(use.Path(\"module_a.py\"))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Aspects and decorators\n",
+    "If you have code like\n",
+    "\n",
+    "```\n",
+    "def foo(x):\n",
+    "    return x ** 2\n",
+    "```\n",
+    "There are two ways to modify the behaviour of the code. Let's say you want to know which arguments were passed in and you want to print those arguments, so you can either add the print statement inside like\n",
+    "```\n",
+    "def foo(x):\n",
+    "    print(x)\n",
+    "    return x ** 2\n",
+    "```\n",
+    "or you can wrap the function with another function which gets called instead like\n",
+    "\n",
+    "```\n",
+    "def decorator(x):\n",
+    "    print(x)\n",
+    "    return foo(x)\n",
+    "```\n",
+    "which you can also write as a function that takes a function as argument - a \"higher order function\" if you will - like\n",
+    "```\n",
+    "def decorator(func):\n",
+    "   def wrapper(*args, **kwargs):\n",
+    "       print(*args, **kwargs)\n",
+    "       return func(*args, **kwargs)\n",
+    "   return wrapper\n",
+    "foo = wrap(foo)\n",
+    "foo(x)\n",
+    "```\n",
+    "which looks a bit convoluted, so there is some syntactic sugar in python to make it look nicer:\n",
+    "```\n",
+    "@decorator\n",
+    "def foo(x):\n",
+    "    return x ** 2\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "There is nothing wrong with this approach, it's a plain and simple decorator, obvious reading the code. The only big problem is that single decorator is nice and simple but adding more quickly gets messy and complicated, not just because it gets hard to read and reason about but also because writing correct decorators is not as plain and simple as it may look like. For example, the *decorator* function above is bad because it will shadow the signature and docstring of the function it is wrapping. The second big problem is that it is quite messy to add decorators manually to code with lots of functions or methods. It can be not only a lot to write but also add visual noise, making it harder to read code (the opposite of what it was supposed to do!) while making it harder to keep [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself). The third big problem, no wait, amongst the chief problems of manually adding decorators is that it can be quite painful or impossible to deal with callables (functions, methods but also classes can be callable!) that originate in code you can't control, for example code that isn't even written in python but in C (like numpy)."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Our solution: use() adds functionality to the modules you request and gives you an easy way to decorate *everything* in a single line."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 29,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:11:52.533686Z",
+     "iopub.status.busy": "2022-03-29T17:11:52.533263Z",
+     "iopub.status.idle": "2022-03-29T17:11:52.566761Z",
+     "shell.execute_reply": "2022-03-29T17:11:52.565859Z",
+     "shell.execute_reply.started": "2022-03-29T17:11:52.533646Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.main\u001b[1;30m: \u001b[0mcase = (False, False, True, False)\n",
+      "\u001b[1;320mINFO\u001b[1;30m: \u001b[0m\u001b[1;36muse.buffet_old\u001b[1;30m: \u001b[0mresult = <module 'numpy' from '/home/thorsten/anaconda3/lib/python3.8/site-packages/numpy/__init__.py'>\n"
+     ]
+    }
+   ],
+   "source": [
+    "np = use(\"numpy\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Justuse comes with two decorators `use.woody_logger` and `use.tinny_profiler` which you can use but it also works for decorators like `beartype`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 30,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:13:24.617281Z",
+     "iopub.status.busy": "2022-03-29T17:13:24.616920Z",
+     "iopub.status.idle": "2022-03-29T17:13:25.286756Z",
+     "shell.execute_reply": "2022-03-29T17:13:25.285785Z",
+     "shell.execute_reply.started": "2022-03-29T17:13:24.617243Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Please check your browser to select options and filters for aspects.\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "<module 'numpy' from '/home/thorsten/anaconda3/lib/python3.8/site-packages/numpy/__init__.py'>"
+      ]
+     },
+     "execution_count": 30,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "np @  use.woody_logger"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2021-11-26T15:28:48.065021Z",
+     "iopub.status.busy": "2021-11-26T15:28:48.064485Z",
+     "iopub.status.idle": "2021-11-26T15:28:48.074691Z",
+     "shell.execute_reply": "2021-11-26T15:28:48.072916Z",
+     "shell.execute_reply.started": "2021-11-26T15:28:48.064974Z"
+    }
+   },
+   "source": [
+    "After waiting until the page is fully loaded (which can take a while..) we now can see all the thousands of callables inside numpy that we could apply our decorator with. This also allows us to play with different filters to make sure we only hit what we want. Now let's see what happens when we actually apply this decorator to all those callables."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 31,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:13:34.619405Z",
+     "iopub.status.busy": "2022-03-29T17:13:34.618424Z",
+     "iopub.status.idle": "2022-03-29T17:13:34.848266Z",
+     "shell.execute_reply": "2022-03-29T17:13:34.847301Z",
+     "shell.execute_reply.started": "2022-03-29T17:13:34.619364Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_ipython_display_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_mimebundle_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_html_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_markdown_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_svg_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_png_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_pdf_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_jpeg_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_latex_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_json_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_javascript_',) {} -> numpy.__getattr__\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "<module 'numpy' from '/home/thorsten/anaconda3/lib/python3.8/site-packages/numpy/__init__.py'>"
+      ]
+     },
+     "execution_count": 31,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "use.apply_aspect(np, use.woody_logger)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "We wrapped *all* functions in the numpy package with a decorator that lets us directly observe what happens when we call something without the need for an external debugger!"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 32,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:13:47.971129Z",
+     "iopub.status.busy": "2022-03-29T17:13:47.970573Z",
+     "iopub.status.idle": "2022-03-29T17:13:48.094803Z",
+     "shell.execute_reply": "2022-03-29T17:13:48.093669Z",
+     "shell.execute_reply.started": "2022-03-29T17:13:47.971088Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "([1, 2, 3],) {} -> numpy.array\n",
+      "(<class 'int'>,) {} -> numpy.dtype\n"
+     ]
+    },
+    {
+     "ename": "TypeError",
+     "evalue": "issubclass() arg 2 must be a class or tuple of classes",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
+      "\u001b[0;32m/tmp/ipykernel_3329/3038565759.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/aspectizing.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    233\u001b[0m         \u001b[0;31m# )\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    234\u001b[0m         print(\n\u001b[0;32m--> 235\u001b[0;31m             \u001b[0;34mf\"-> {module}{qualname} (in {after - before} ns ({round((after - before) / 10**9, 5)} sec) -> {res} {type(res)}\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    236\u001b[0m         )\n\u001b[1;32m    237\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mres\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36m_array_str_implementation\u001b[0;34m(a, max_line_width, precision, suppress_small, array2string)\u001b[0m\n\u001b[1;32m   1549\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0m_guarded_repr_or_str\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1550\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1551\u001b[0;31m     \u001b[0;32mreturn\u001b[0m \u001b[0marray2string\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_line_width\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprecision\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msuppress_small\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m' '\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1552\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1553\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36marray2string\u001b[0;34m(a, max_line_width, precision, suppress_small, separator, prefix, style, formatter, threshold, edgeitems, sign, floatmode, suffix, legacy)\u001b[0m\n\u001b[1;32m    696\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0;34m\"[]\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    697\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 698\u001b[0;31m     \u001b[0;32mreturn\u001b[0m \u001b[0m_array2string\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mseparator\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprefix\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    699\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    700\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m    473\u001b[0m             \u001b[0mrepr_running\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    474\u001b[0m             \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 475\u001b[0;31m                 \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    476\u001b[0m             \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    477\u001b[0m                 \u001b[0mrepr_running\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdiscard\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36m_array2string\u001b[0;34m(a, options, separator, prefix)\u001b[0m\n\u001b[1;32m    499\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    500\u001b[0m     \u001b[0;31m# find the right formatting function for the array\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 501\u001b[0;31m     \u001b[0mformat_function\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_get_format_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    502\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    503\u001b[0m     \u001b[0;31m# skip over \"[\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36m_get_format_function\u001b[0;34m(data, **options)\u001b[0m\n\u001b[1;32m    427\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0mformatdict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'timedelta'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    428\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 429\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mformatdict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'int'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    430\u001b[0m     \u001b[0;32melif\u001b[0m \u001b[0missubclass\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtypeobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_nt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfloating\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    431\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0missubclass\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtypeobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_nt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlongfloat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36m<lambda>\u001b[0;34m()\u001b[0m\n\u001b[1;32m    372\u001b[0m     formatdict = {\n\u001b[1;32m    373\u001b[0m         \u001b[0;34m'bool'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mlambda\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mBoolFormat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 374\u001b[0;31m         \u001b[0;34m'int'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mlambda\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mIntegerFormat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    375\u001b[0m         'float': lambda: FloatingFormat(\n\u001b[1;32m    376\u001b[0m             data, precision, floatmode, suppress, sign, legacy=legacy),\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m   1185\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1186\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msize\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1187\u001b[0;31m             max_str_len = max(len(str(np.max(data))),\n\u001b[0m\u001b[1;32m   1188\u001b[0m                               len(str(np.min(data))))\n\u001b[1;32m   1189\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/aspectizing.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    225\u001b[0m     \u001b[0;34m@\u001b[0m\u001b[0mwraps\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    226\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 227\u001b[0;31m         \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"{args} {kwargs} -> {module}{qualname}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    228\u001b[0m         \u001b[0mbefore\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mperf_counter_ns\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    229\u001b[0m         \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36m_array_repr_implementation\u001b[0;34m(arr, max_line_width, precision, suppress_small, array2string)\u001b[0m\n\u001b[1;32m   1436\u001b[0m         \u001b[0mclass_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"array\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1437\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1438\u001b[0;31m     \u001b[0mskipdtype\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdtype_is_implied\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0marr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msize\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1439\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1440\u001b[0m     \u001b[0mprefix\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mclass_name\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m\"(\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/arrayprint.py\u001b[0m in \u001b[0;36mdtype_is_implied\u001b[0;34m(dtype)\u001b[0m\n\u001b[1;32m   1388\u001b[0m     \u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mint8\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1389\u001b[0m     \"\"\"\n\u001b[0;32m-> 1390\u001b[0;31m     \u001b[0mdtype\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1391\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0m_format_options\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'legacy'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'1.13'\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtype\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mbool_\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1392\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/aspectizing.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    225\u001b[0m     \u001b[0;34m@\u001b[0m\u001b[0mwraps\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    226\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 227\u001b[0;31m         \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"{args} {kwargs} -> {module}{qualname}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    228\u001b[0m         \u001b[0mbefore\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mperf_counter_ns\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    229\u001b[0m         \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/_dtype.py\u001b[0m in \u001b[0;36m__repr__\u001b[0;34m(dtype)\u001b[0m\n\u001b[1;32m     44\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     45\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__repr__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 46\u001b[0;31m     \u001b[0marg_str\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_construction_repr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minclude_align\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     47\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misalignedstruct\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     48\u001b[0m         \u001b[0marg_str\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0marg_str\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m\", align=True\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/_dtype.py\u001b[0m in \u001b[0;36m_construction_repr\u001b[0;34m(dtype, include_align, short)\u001b[0m\n\u001b[1;32m     98\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0m_subarray_str\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     99\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 100\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0m_scalar_str\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mshort\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mshort\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    101\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    102\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/_dtype.py\u001b[0m in \u001b[0;36m_scalar_str\u001b[0;34m(dtype, short)\u001b[0m\n\u001b[1;32m    102\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    103\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_scalar_str\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mshort\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 104\u001b[0;31m     \u001b[0mbyteorder\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_byte_order_str\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    105\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    106\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtype\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbool_\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/_dtype.py\u001b[0m in \u001b[0;36m_byte_order_str\u001b[0;34m(dtype)\u001b[0m\n\u001b[1;32m    161\u001b[0m     \u001b[0;34m\"\"\" Normalize byteorder to '<' or '>' \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    162\u001b[0m     \u001b[0;31m# hack to obtain the native and swapped byte order characters\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 163\u001b[0;31m     \u001b[0mswapped\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnewbyteorder\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'S'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    164\u001b[0m     \u001b[0mnative\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mswapped\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnewbyteorder\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'S'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    165\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/use/aspectizing.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    233\u001b[0m         \u001b[0;31m# )\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    234\u001b[0m         print(\n\u001b[0;32m--> 235\u001b[0;31m             \u001b[0;34mf\"-> {module}{qualname} (in {after - before} ns ({round((after - before) / 10**9, 5)} sec) -> {res} {type(res)}\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    236\u001b[0m         )\n\u001b[1;32m    237\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mres\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/core/_dtype.py\u001b[0m in \u001b[0;36m__str__\u001b[0;34m(dtype)\u001b[0m\n\u001b[1;32m     37\u001b[0m     \u001b[0;32melif\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubdtype\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     38\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0m_subarray_str\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 39\u001b[0;31m     \u001b[0;32melif\u001b[0m \u001b[0missubclass\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mflexible\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misnative\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     40\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     41\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;31mTypeError\u001b[0m: issubclass() arg 2 must be a class or tuple of classes"
+     ]
+    }
+   ],
+   "source": [
+    "np.array([1,2,3])"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "If you aren't in a situation where you need to debug, log or control access (the classical applications of AOP) you might still want to use it in python - for type-checking/testing!\n",
+    "For example you can apply our favorite dynamic type checker library beartype quite easily like so:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 34,
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2022-03-29T17:14:26.695988Z",
+     "iopub.status.busy": "2022-03-29T17:14:26.695478Z",
+     "iopub.status.idle": "2022-03-29T17:14:26.739781Z",
+     "shell.execute_reply": "2022-03-29T17:14:26.738349Z",
+     "shell.execute_reply.started": "2022-03-29T17:14:26.695949Z"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "() {} -> numpy.__dir__\n",
+      "-> numpy.__dir__ (in 103966 ns (0.0001 sec) -> ['zeros', 'diagflat', 'reciprocal', '__getattr__', 'PINF', 'UFUNC_BUFSIZE_DEFAULT', 'base_repr', 'greater_equal', 'rollaxis', 'sort', 'allclose', 'isin', 'save', 'Bytes0', 'signedinteger', 's_', 'put', 'diag_indices_from', 'hsplit', 'roots', 'shares_memory', 'equal', 'identity', 'add', 'nanquantile', 'Str0', 'lookfor', 'issubsctype', 'format_parser', 'TooHardError', 'DataSource', 'iinfo', 'dsplit', 'around', 'add_docstring', 'ma', 'recarray', 'reshape', 'infty', '_distributor_init', 'polyder', 'void0', 'os', '__doc__', 'array', 'warnings', 'argpartition', 'single', 'char', 'MAY_SHARE_BOUNDS', 'test', 'sometrue', 'inf', 'spacing', 'sctypeDict', 'atleast_1d', 'SHIFT_INVALID', 'load', 'transpose', 'mask_indices', 'put_along_axis', 'flatnonzero', 'False_', 'roll', 'nanmean', 'alen', 'promote_types', 'kernel_version', 'flip', '__loader__', 'source', 'Datetime64', 'mintypecode', 'product', 'ndfromtxt', 'linalg', 'longfloat', 'multiply', 'nanpercentile', 'SHIFT_DIVIDEBYZERO', '_version', 'repeat', 'longlong', 'tril', 'divmod', 'negative', 'add_newdoc_ufunc', 'str_', 'isfortran', 'logaddexp2', 'mod', 'min_scalar_type', 'ERR_DEFAULT', 'signbit', 'expand_dims', 'corrcoef', 'pad', 'geterrobj', 'radians', 'amax', 'indices', 'PZERO', 'array_equiv', 'True_', 'string_', 'asanyarray', 'nonzero', 'float32', 'ubyte', 'ScalarType', 'find_common_type', 'hamming', 'who', 'blackman', 'ones', 'divide', 'cov', 'cdouble', 'float_', 'ndim', 'format_float_scientific', 'diagonal', 'typecodes', 'void', 'convolve', 'FPE_DIVIDEBYZERO', 'setxor1d', 'finfo', 'RAISE', 'mkl', 'asmatrix', 'logaddexp', 'geterrcall', 'issubclass_', 'savetxt', '_globals', 'may_share_memory', 'append', 'take', '__cached__', 'broadcast_shapes', '_pytesttester', 'maximum_sctype', 'hanning', 'asfarray', 'copysign', 'datetime_as_string', 'clongfloat', 'triu_indices_from', 'broadcast_arrays', 'invert', 'cfloat', 'unravel_index', 'packbits', 'log2', 'uintc', 'arcsinh', 'ix_', 'newaxis', 'floating', 'absolute', 'meshgrid', 'little_endian', 'get_array_wrap', 'histogramdd', 'sinh', 'sqrt', 'greater', 'Uint64', '_financial_names', 'dstack', 'ogrid', 'rad2deg', '__mkl_version__', 'correlate', 'seterrobj', 'disp', 'tensordot', 'vstack', 'round', 'unpackbits', 'angle', 'choose', 'quantile', 'full_like', 'csingle', 'fmod', 'cbrt', 'bitwise_not', '_mat', 'bitwise_and', 'bincount', 'bmat', '__expired_functions__', 'polyfit', 'minimum', 'info', 'ravel_multi_index', 'expm1', 'trunc', 'bartlett', 'Infinity', 'datetime_data', '__git_version__', 'vdot', 'matmul', 'BUFSIZE', '__builtins__', 'array_equal', 'floor', 'nanmin', 'frompyfunc', 'clip', 'sum', 'polyint', 'i0', 'loads', 'log', 'float16', 'einsum', 'NZERO', 'polynomial', 'shape', 'fromstring', 'issctype', 'matrixlib', 'sctypes', 'nansum', 'where', 'polymul', 'delete', 'hypot', '__config__', 'cross', 'isscalar', 'vsplit', 'matrix', 'tanh', 'row_stack', 'int64', 'true_divide', 'savez', 'errstate', 'interp', 'nanstd', 'positive', 'asarray_chkfinite', 'all', 'histogram2d', 'diag_indices', 'apply_over_axes', 'nditer', 'sort_complex', 'ufunc', 'printoptions', 'sign', 'average', 'fliplr', 'nanprod', 'int0', 'fromiter', 'memmap', 'WRAP', 'array_str', 'intc', 'polysub', 'ndarray', 'alltrue', 'use_hugepage', 'nextafter', 'zeros_like', 'apply_along_axis', 'arctanh', 'cast', 'place', 'ascontiguousarray', 'deg2rad', 'tri', 'ceil', 'iscomplex', 'complex64', 'frombuffer', 'recfromtxt', '__package__', 'arange', 'datetime64', 'ushort', 'nanargmin', 'amin', 'log1p', 'sctype2char', 'squeeze', '_NoValue', 'argmin', 'ERR_LOG', 'euler_gamma', 'oldnumeric', 'can_cast', 'fix', 'Inf', 'is_busday', 'insert', 'MAXDIMS', 'asfortranarray', 'setbufsize', 'arctan', 'outer', 'argwhere', 'deprecate_with_doc', 'logical_not', 'CLIP', 'deprecate', 'isnan', 'bool8', 'clongdouble', 'intersect1d', 'mat', 'concatenate', 'ndenumerate', 'flipud', 'hstack', 'bytes_', 'isneginf', 'real_if_close', 'NaN', 'obj2sctype', 'getbufsize', 'inner', 'fromregex', 'compress', 'trapz', 'degrees', 'busday_count', 'SHIFT_OVERFLOW', 'fromfunction', 'fft', 'compat', 'logical_and', 'isinf', 'prod', 'index_exp', 'conjugate', 'isrealobj', 'searchsorted', 'histogram_bin_edges', 'ALLOW_THREADS', 'swapaxes', 'VisibleDeprecationWarning', 'copyto', 'bitwise_xor', 'uint0', 'atleast_2d', 'diag', 'unicode_', 'msort', 'dot', 'number', 'numarray', 'broadcast_to', 'trace', 'longdouble', '__version__', 'kaiser', 'result_type', 'poly1d', 'split', 'moveaxis', 'take_along_axis', 'rint', 'arctan2', 'format_float_positional', 'conj', 'object0', 'isclose', 'floor_divide', 'AxisError', 'float64', '__name__', 'get_include', 'byte_bounds', 'nan', 'atleast_3d', 'column_stack', 'count_nonzero', 'busday_offset', 'triu', 'cumsum', 'require', 'set_printoptions', 'full', 'fill_diagonal', 'tan', 'uint16', 'union1d', 'chararray', 'iscomplexobj', 'FPE_UNDERFLOW', 'flexible', 'arccos', 'isreal', 'ERR_CALL', 'nanvar', 'tile', 'ravel', 'array_repr', 'cumprod', 'lexsort', 'diff', 'modf', '__file__', 'std', 'Tester', 'eye', 'lcm', 'heaviside', 'lib', 'putmask', 'percentile', 'issubdtype', 'ediff1d', 'longcomplex', 'record', 'generic', 'geterr', 'iterable', 'nanmedian', 'int32', 'unsignedinteger', 'nan_to_num', 'uint8', 'safe_eval', 'math', 'mean', 'e', 'partition', 'NAN', 'double', 'arccosh', 'float_power', 'trim_zeros', 'log10', 'nancumsum', 'real', '_add_newdoc_ufunc', '__dir__', 'right_shift', 'busdaycalendar', 'sys', 'ModuleDeprecationWarning', 'copy', 'genfromtxt', 'array_split', 'less', 'FPE_OVERFLOW', 'ERR_WARN', 'inexact', 'isnat', 'uint64', 'complex256', 'imag', 'triu_indices', 'get_printoptions', 'complex128', 'MAY_SHARE_EXACT', 'add_newdoc', 'logspace', 'emath', 'extract', 'uint', 'seterr', 'fabs', 'block', 'ctypeslib', 'ERR_IGNORE', 'intp', 'subtract', 'median', 'round_', 'show_config', 'cosh', 'mgrid', 'compare_chararrays', 'NINF', 'square', 'nested_iters', 'digitize', 'size', 'pi', 'loadtxt', 'exp', 'FPE_INVALID', 'recfromcsv', 'sin', 'uintp', 'broadcast', 'power', 'piecewise', 'SHIFT_UNDERFLOW', 'fromfile', 'asscalar', 'binary_repr', 'argsort', 'set_numeric_ops', 'cumproduct', 'uint32', 'bool_', 'select', 'UFUNC_PYVALS_NAME', '__spec__', 'ldexp', 'int8', 'einsum_path', 'byte', 'fmin', 'ERR_PRINT', 'gradient', 'set_string_function', 'r_', 'min', 'polyadd', 'logical_xor', 'isposinf', 'poly', 'mafromtxt', 'c_', 'integer', 'random', '__NUMPY_SETUP__', 'tril_indices_from', 'core', 'stack', 'ulonglong', 'setdiff1d', 'left_shift', 'ndindex', 'ERR_RAISE', 'savez_compressed', '__deprecated_attrs__', 'maximum', 'singlecomplex', 'nbytes', 'cos', 'vander', 'common_type', 'dtype', 'nanargmax', 'vectorize', 'complexfloating', 'fastCopyAndTranspose', 'tril_indices', 'half', 'empty_like', 'FLOATING_POINT_SUPPORT', 'RankWarning', 'not_equal', 'rec', 'frexp', 'nancumprod', '__all__', 'testing', 'character', 'asarray', 'abs', 'ptp', 'array2string', 'timedelta64', 'flatiter', 'less_equal', 'int16', 'gcd', 'geomspace', 'tracemalloc_domain', 'histogram', 'complex_', 'polyval', 'nanmax', 'logical_or', 'unwrap', 'unique', 'in1d', 'typename', 'short', 'ComplexWarning', 'ones_like', 'exp2', 'isfinite', 'linspace', '__path__', 'bytes0', 'empty', 'var', 'int_', 'polydiv', 'float128', 'object_', 'resize', 'bitwise_or', '_UFUNC_API', 'seterrcall', 'remainder', 'fmax', 'max', 'sinc', 'MachAr', 'version', 'any', 'rot90', 'argmax', 'arcsin', 'str0', 'kron'] <class 'list'>\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_ipython_display_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_mimebundle_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_html_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_markdown_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_svg_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_png_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_pdf_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_jpeg_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_latex_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_json_',) {} -> numpy.__getattr__\n",
+      "('_ipython_canary_method_should_not_exist_',) {} -> numpy.__getattr__\n",
+      "('_repr_javascript_',) {} -> numpy.__getattr__\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "<module 'numpy' from '/home/thorsten/anaconda3/lib/python3.8/site-packages/numpy/__init__.py'>"
+      ]
+     },
+     "execution_count": 34,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "from beartype import beartype\n",
+    "\n",
+    "use.apply_aspect(np, beartype)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2021-11-26T15:35:16.483099Z",
+     "iopub.status.busy": "2021-11-26T15:35:16.482573Z",
+     "iopub.status.idle": "2021-11-26T15:35:16.507905Z",
+     "shell.execute_reply": "2021-11-26T15:35:16.505878Z",
+     "shell.execute_reply.started": "2021-11-26T15:35:16.483062Z"
+    }
+   },
+   "source": [
+    "Now all functions in numpy are beartype-checked! You can do the same with your own code, as long as you use() your modules."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "execution": {
+     "iopub.execute_input": "2021-11-26T15:32:34.252907Z",
+     "iopub.status.busy": "2021-11-26T15:32:34.252454Z",
+     "iopub.status.idle": "2021-11-26T15:32:34.270157Z",
+     "shell.execute_reply": "2021-11-26T15:32:34.266549Z",
+     "shell.execute_reply.started": "2021-11-26T15:32:34.252870Z"
+    }
+   },
+   "source": [
+    "If you want to learn more about aspect-oriented programming, check out https://en.wikipedia.org/wiki/Aspect-oriented_programming "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Even though applying decorators this way usually is super simple and nice, one word of caution: in python it sometimes is not clear at all *what* something is. If you do `foo(x)` foo could be a pure function, an object with a `__call__` method or you might be calling the `__init__` method of a class. While it is nice for the user to be oblivious about those details in general, in this case it can be quite confusing and frustrating because each case needs to be handled differently and using a check like isfunction might be catching the wrong things. So, be aware of these potential pitfalls before applying decorators blindly without checking what actually got hit."
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "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.8.5"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/justuse-0.7.6/docs/demo.py b/justuse-0.7.6/docs/demo.py
new file mode 100644
index 00000000..3ee3542f
--- /dev/null
+++ b/justuse-0.7.6/docs/demo.py
@@ -0,0 +1,2 @@
+def foo():
+   print("Hello justuse-user!")
\ No newline at end of file
diff --git a/src/use/__init__.py b/src/use/__init__.py
index 350b21f6..f2331d11 100755
--- a/src/use/__init__.py
+++ b/src/use/__init__.py
@@ -108,7 +108,7 @@ def fraction_of_day(now: datetime = None) -> float:
 # current use __version__ variable **AS A STRING LITERAL** from
 # this file. If you do anything except updating the version,
 # please check that setup.py can still be executed.
-__version__ = "0.7.5"
+__version__ = "0.7.8"
 # for tests
 __version__ = os.getenv("USE_VERSION", __version__)
 __name__ = "use"
@@ -181,10 +181,17 @@ class Modes(IntEnum):
     no_cleanup = 2**7
 
 
-from use.aspectizing import apply_aspect
+from use.aspectizing import (
+    apply_aspect,
+    iter_submodules,
+    show_aspects,
+    show_profiling,
+    tinny_profiler,
+    woody_logger,
+)
 from use.buffet_old import buffet_table
-from use.main import ProxyModule, Use, test_version
-from use.pydantics import Version
+from use.main import URL, ProxyModule, Use, test_version
+from use.pydantics import Version, git
 
 for member in Modes:
     setattr(Use, member.name, member.value)
@@ -204,4 +211,4 @@ class Modes(IntEnum):
 
 with catch_warnings():
     filterwarnings("ignore", category=BeartypeDecorHintPep585DeprecationWarning, module="beartype")
-    # apply_aspect(use, beartype, check=isbeartypeable, pattern="")
+    apply_aspect(use.iter_submodules(use), beartype)
diff --git a/src/use/aspectizing.py b/src/use/aspectizing.py
index e6d26219..5c2d0442 100644
--- a/src/use/aspectizing.py
+++ b/src/use/aspectizing.py
@@ -1,21 +1,19 @@
-import builtins
+import ast
+import contextlib
 import inspect
 import re
 import sys
 from collections import namedtuple
-from collections.abc import Callable
+from collections.abc import Callable, Iterable
 from enum import Enum
 from functools import wraps
-from importlib.util import spec_from_loader
 from logging import getLogger
 from pathlib import Path
 from time import perf_counter_ns
 from types import ModuleType
-from typing import Any, DefaultDict, Deque, Optional
-from warnings import catch_warnings, filterwarnings
+from typing import Any, DefaultDict, Deque, Optional, Union
 
 from beartype import beartype
-from beartype.roar import BeartypeDecorHintPep585DeprecationWarning
 from icontract import require
 
 log = getLogger(__name__)
@@ -25,9 +23,9 @@
 
 # TODO: use an extra WeakKeyDict as watchdog for object deletions and trigger cleanup in these here
 _applied_decorators: DefaultDict[tuple[object, str], Deque[Callable]] = DefaultDict(Deque)
-"{qualname: [callable]} - to see which decorators are applied, in which order"
+"to see which decorators are applied, in which order"
 _aspectized_functions: DefaultDict[tuple[object, str], Deque[Callable]] = DefaultDict(Deque)
-"{qualname: [callable]} - the actually decorated functions to undo aspectizing"
+"the actually decorated functions to undo aspectizing"
 
 
 def show_aspects():
@@ -45,51 +43,52 @@ def is_callable(thing):
         return False
 
 
-HIT = namedtuple("Hit", "qualname name type success exception dunder")
+HIT = namedtuple("Hit", "qualname name type success exception dunder module_name")
 
 
-@beartype
 def apply_aspect(
-    thing: Any,
+    thing: Union[object, Iterable[object]],
     decorator: Callable,
     /,
     *,
     check: Callable = is_callable,
-    pattern: str = "",
-    module_name: Optional[str] = None,
-    regex: Optional[re.Pattern] = None,
-    aspectize_dunders: bool = False,
-    recursive: bool = True,
     dry_run: bool = False,
-    visited: Optional[set[int]] = None,
+    pattern: str = "",
     excluded_names: Optional[set[str]] = None,
     excluded_types: Optional[set[type]] = None,
-    hits: Optional[list[HIT]] = None,
-    last: bool = True,  # and first
-    qualname_lst: Optional[list] = None,
-) -> Any:
+    file=None,
+) -> None:
     """Apply the aspect as a side-effect, no copy is created."""
-    name = getattr(thing, "__name__", str(thing))
-    if not qualname_lst:
-        qualname_lst = []
 
-    # to prevent recursion into the depths of hell and beyond
-    if visited is None:
-        visited = {id(obj) for obj in vars(object).values()}
-        visited.add(id(type))
+    regex = re.compile(pattern, re.DOTALL)
 
-    if id(thing) in visited:
-        return
+    if excluded_names is None:
+        excluded_names = set()
+    if excluded_types is None:
+        excluded_types = set()
 
-    qualname_lst.append(name)
+    visited = {id(obj) for obj in vars(object).values()}
+    visited.add(id(type))
+
+    hits = []
+
+    def aspectize(
+        thing: Any,
+        decorator: Callable,
+        /,
+        *,
+        qualname_lst: Optional[list] = None,
+        module_name: str,
+    ) -> Iterable[HIT]:
+        name = getattr(thing, "__name__", str(thing))
+        if not qualname_lst:
+            qualname_lst = []
+        if id(thing) in visited:
+            return
 
-    # initial call
-    if module_name is None:
-        try:
-            module_name = inspect.getmodule(thing).__name__
-        except AttributeError:
-            module_name = "<unknown>"
-    else:  # recursive call - let's stick within the module boundary
+        qualname_lst.append(name)
+
+        # let's stick within the module boundary
         try:
             thing_module_name = inspect.getmodule(thing).__name__
         except AttributeError:
@@ -97,86 +96,79 @@ def apply_aspect(
         if thing_module_name != module_name:
             return
 
-    if hits is None:
-        hits = []
-
-    if excluded_names is None:
-        excluded_names = set()
-    if excluded_types is None:
-        excluded_types = set()
-
-    # We compile once so in subsequent recursive calls, we have it already.
-    if not regex:
-        regex = re.compile(pattern, re.DOTALL)
-
-    for name in dir(thing):
-        qualname = "" if len(qualname_lst) < 3 else "..." + ".".join(qualname_lst[-3:]) + "." + name
-        obj = getattr(thing, name, None)
-        qualname = getattr(obj, "__qualname__", qualname)
-
-        if obj is None:
-            continue
-        # Time to get serious!
-
-        if recursive and type(obj) == type:
-            apply_aspect(
-                obj,
-                decorator,
-                check=check,
-                pattern=pattern,
-                module_name=module_name,
-                regex=regex,
-                aspectize_dunders=aspectize_dunders,
-                excluded_names=excluded_names,
-                excluded_types=excluded_types,
-                recursive=True,
-                visited=visited,
-                dry_run=dry_run,
-                hits=hits,
-                last=False,
-                qualname_lst=qualname_lst,
+        for name in dir(thing):
+            qualname = "" if len(qualname_lst) < 3 else "..." + ".".join(qualname_lst[-3:]) + "." + name
+            obj = getattr(thing, name, None)
+            qualname = getattr(obj, "__qualname__", qualname)
+
+            if obj is None:
+                continue
+            # Time to get serious!
+
+            if type(obj) == type:
+                aspectize(obj, decorator, qualname_lst=qualname_lst, module_name=module_name)
+
+            if id(obj) in visited:
+                continue
+
+            if (
+                qualname in excluded_names
+                or type(obj) in excluded_types
+                or not check(obj)
+                or not regex.match(name)
+            ):
+                continue
+
+            msg = ""
+            success = True
+
+            try:
+                wrapped = _wrap(thing=thing, obj=obj, decorator=decorator, name=name)
+                if dry_run:
+                    _unwrap(thing=thing, name=name)
+            except BaseException as exc:
+                wrapped = obj
+                success = False
+                msg = str(exc)
+                if file:
+                    print(msg, file=file)
+            assert isinstance(name, str) and len(name) > 0
+            assert isinstance(module_name, str) and module_name != ""
+
+            hits.append(
+                HIT(
+                    qualname,
+                    name,
+                    type(wrapped),
+                    success,
+                    msg,
+                    name.startswith("__") and name.endswith("__"),
+                    module_name,
+                )
             )
+            visited.add(id(wrapped))
 
-        if id(obj) in visited:
-            continue
-
-        if (
-            qualname in excluded_names
-            or type(obj) in excluded_types
-            or not check(obj)
-            or not regex.match(name)
-        ):
-            continue
+    def call(m):
+        try:
+            module_name = inspect.getmodule(m).__name__
+        except AttributeError:
+            module_name = "<unknown>"
+        aspectize(m, decorator, module_name=module_name)
 
-        msg = ""
-        success = True
+    if isinstance(thing, Iterable):
+        for x in thing:
+            call(x)
+    else:
+        call(thing)
 
-        try:
-            wrapped = _wrap(thing=thing, obj=obj, decorator=decorator, name=name)
-            if dry_run:
-                _unwrap(thing=thing, name=name)
-        except BaseException as exc:
-            wrapped = obj
-            success = False
-            msg = str(exc)
-        hits.append(
-            HIT(qualname, name, type(wrapped), success, msg, name.startswith("__") and name.endswith("__"))
-        )
-        visited.add(id(wrapped))
-
-    if last and dry_run:
+    if dry_run:
         if config.no_browser:
             print("Tried to do a dry run and display the results, but no_browser is set in config.")
         else:
             print("Please check your browser to select options and filters for aspects.")
             _web_aspectized_dry_run(
-                decorator=decorator,
-                pattern=pattern,
-                check=check,
-                hits=hits,
-                module_name=module_name,
+                decorator=decorator, pattern=pattern, check=check, hits=hits, module_name=str(thing)
             )
-    return thing
 
 
 @beartype
@@ -208,7 +200,13 @@ def _unwrap(*, thing: Any, name: str):
     return original
 
 
-def woody_logger(func: Callable) -> Callable:
+def _qualname(thing):
+    module = getattr(thing, "__module__", None) or getattr(thing.__class__, "__module__", None)
+    qualname = getattr(thing, "__qualname__", None) or getattr(thing, "__name__", None) or str(thing)
+    return f"{module}::{qualname}"
+
+
+def woody_logger(thing: Callable) -> Callable:
     """
     Decorator to log/track/debug calls and results.
 
@@ -217,24 +215,34 @@ def woody_logger(func: Callable) -> Callable:
     Returns:
         function: The decorated callable.
     """
-    qualname = getattr(func, "__qualname__", None) or getattr(func, "__name__", None) or str(func)
-    module = getattr(func, "__module__", None) or getattr(func.__class__, "__module__", None)
-    if module:
-        module += "."
-
-    @wraps(func)
-    def wrapper(*args, **kwargs):
-        print(f"{args} {kwargs} -> {module}{qualname}")
-        before = perf_counter_ns()
-        res = func(*args, **kwargs)
-        after = perf_counter_ns()
-        # log.debug(
-        #     f"{func.__module__}::{getattr(func, '__qualname__', func.__name__)}({args}, {kwargs}) -> {res} {type(res)}"
-        # )
-        print(
-            f"-> {module}{qualname} (in {after - before} ns ({round((after - before) / 10**9, 5)} sec) -> {res} {type(res)}"
-        )
-        return res
+    # A class is an instance of type - its type is also type, but only checking for `type(thing) is type`
+    # would exclude metaclasses other than type - not complicated at all.
+    if isinstance(thing, type):
+        # wrapping the class means wrapping `__new__` mainly, which must return the original class, not just a proxy -
+        # because a proxy never could hold up under scrutiny of type(), which can't be faked (like, at all).
+        class wrapper(thing.__class__):
+            def __new__(cls, *args, **kwargs):
+                print(f"{args} {kwargs} -> {thing.__name__}()")
+                before = perf_counter_ns()
+                res = thing(*args, **kwargs)
+                after = perf_counter_ns()
+                print(
+                    f"-> {thing.__name__}() (in {after - before} ns ({round((after - before) / 10**9, 5)} sec) -> {type(res)}"
+                )
+                return res
+
+    else:
+        # Wrapping a function is way easier..
+        @wraps(thing)
+        def wrapper(*args, **kwargs):
+            print(f"{args} {kwargs} -> {_qualname(thing)}")
+            before = perf_counter_ns()
+            res = thing(*args, **kwargs)
+            after = perf_counter_ns()
+            print(
+                f"-> {_qualname(thing)} (in {after - before} ns ({round((after - before) / 10**9, 5)} sec) -> {res} {type(res)}"
+            )
+            return res
 
     return wrapper
 
@@ -265,3 +273,49 @@ def wrapper(*args, **kwargs):
 
 def show_profiling():
     _web_tinny_profiler(_timings)
+
+
+def _is_builtin(name, mod):
+    if name in sys.builtin_module_names:
+        return True
+
+    if hasattr(mod, "__file__"):
+        relpath = Path(mod.__file__).parent.relative_to((Path(sys.executable).parent / "lib"))
+        if relpath == Path():
+            return True
+        if relpath.parts[0] == "site-packages":
+            return False
+    return True
+
+
+def _get_imports_from_module(mod):
+    if not hasattr(mod, "__file__"):
+        return
+    with open(mod.__file__, "rb") as file:
+        with contextlib.suppress(ValueError):
+            for x in ast.walk(ast.parse(file.read())):
+                if isinstance(x, ast.Import):
+                    name = x.names[0].name
+                    if (mod := sys.modules.get(name)) and not _is_builtin(name, mod):
+                        yield name, mod
+                if isinstance(x, ast.ImportFrom):
+                    name = x.module
+                    if (mod := sys.modules.get(name)) and not _is_builtin(name, mod):
+                        yield name, mod
+
+
+def iter_submodules(mod: ModuleType, visited=None, results=None) -> set[ModuleType]:
+    """Find all modules recursively that were imported as dependency from  the given module."""
+    if results is None:
+        results = set()
+    if visited is None:
+        visited = set()
+    for name, x in _get_imports_from_module(mod):
+        if name in visited:
+            continue
+        visited.add(name)
+        results.add(name)
+        for name, x in _get_imports_from_module(sys.modules[name]):
+            results.add(x)
+            iter_submodules(x, visited, results)
+    return results
diff --git a/src/use/main.py b/src/use/main.py
index f39a4ab1..23959a6f 100755
--- a/src/use/main.py
+++ b/src/use/main.py
@@ -25,7 +25,6 @@
 from warnings import warn
 
 import requests
-import toml
 from furl import furl as URL
 from icontract import require
 
@@ -46,8 +45,15 @@
 from use.aspectizing import _applied_decorators, apply_aspect
 from use.hash_alphabet import JACK_as_num, is_JACK, num_as_hexdigest
 from use.messages import KwargMessage, StrMessage, TupleMessage, UserMessage
-from use.pimp import _build_mod, _ensure_path, _fail_or_default, _parse_name, _real_path
-from use.pydantics import Version
+from use.pimp import (
+    _build_mod,
+    _ensure_path,
+    _fail_or_default,
+    _modules_are_compatible,
+    _parse_name,
+    _real_path,
+)
+from use.pydantics import Version, git
 from use.tools import methdispatch
 
 log = getLogger(__name__)
@@ -116,7 +122,6 @@ def some_decorator(x):
         assert isinstance(other, Callable)
 
         kwargs = {
-            "aspectize_dunders": True,
             "excluded_types": {
                 ProxyModule,
             },
@@ -171,6 +176,8 @@ async def run_async(self):
                         initial_globals=self.initial_globals,
                         module_path=self.path.resolve(),
                     )
+                    if not _modules_are_compatible(self.proxy, mod):
+                        continue
                     self.proxy.__implementation = mod
                 except KeyError:
                     traceback.print_exc()
@@ -192,6 +199,8 @@ def run_threaded(self):
                             initial_globals=self.initial_globals,
                             module_path=self.path,
                         )
+                        if not _modules_are_compatible(self.proxy, mod):
+                            continue
                         self.proxy._ProxyModule__implementation = mod
                     except KeyError:
                         traceback.print_exc()
@@ -206,6 +215,12 @@ def __del__(self):
 
 
 class Use(ModuleType):
+    """
+    # Welcome to the world of use
+
+    *asdf* adsf
+    """
+
     def __init__(self):
         self._using = _using
         # might run into issues during testing otherwise
@@ -417,6 +432,16 @@ def _use_url(
             sys.modules[as_import] = mod
         return ProxyModule(mod)
 
+    @__call__.register(git)
+    def _use_git(
+        self,
+        git_repo: git,
+        /,
+        *,
+        modes=0,
+    ) -> ProxyModule:
+        """Install git repo."""
+
     @__call__.register(Path)
     def _use_path(
         self,
diff --git a/src/use/pimp.py b/src/use/pimp.py
index c6912bc9..71ec7a9e 100755
--- a/src/use/pimp.py
+++ b/src/use/pimp.py
@@ -2,8 +2,8 @@
 Delegating package installation to pip, packaging and friends.
 """
 
-
 import codecs
+import collections
 import contextlib
 import importlib.util
 import inspect
@@ -23,15 +23,15 @@
 from importlib import metadata
 from importlib.machinery import ModuleSpec, SourceFileLoader
 from importlib.metadata import Distribution, PackageNotFoundError, PackagePath
-from itertools import chain, product
+from itertools import chain, product, zip_longest
 from logging import getLogger
-from os.path import abspath, split
+from numbers import Complex, Integral, Number, Rational, Real
 from pathlib import Path, PureWindowsPath, WindowsPath
 from shutil import rmtree
 from sqlite3 import Cursor
 from subprocess import CalledProcessError, run
 from types import ModuleType
-from typing import Any, Iterable, Optional, Protocol, TypeVar, Union, runtime_checkable
+from typing import Any, Iterable, Optional, Protocol, TypeVar, Union, get_args, get_origin, runtime_checkable
 from warnings import catch_warnings, filterwarnings, warn
 
 import furl
@@ -268,7 +268,7 @@ def _pebkac_no_hash(
     releases = _get_releases(project)
 
     if version not in (r.version for r in releases):
-        last_version = next(iter(reversed(project.releases)))
+        last_version = project.releases >> reversed >> iter >> next
         return RuntimeWarning(Message.no_distribution_found(package_name, version, last_version))
 
     project = _filter_by_version(releases, version=version)
@@ -782,13 +782,16 @@ def _get_data_from_pypi(*, package_name: str, version: str = None) -> PyPI_Proje
 
 @beartype
 def _filter_by_platform(releases: list[PyPI_Release], *, tags: frozenset[PlatformTag]) -> list[PyPI_Release]:
-    filtered = [
-        release for release in releases if _is_compatible(release, platform_tags=tags, include_sdist=False)
-    ]
+    def compatible(info: PyPI_Release, include_sdist=False) -> bool:
+        return (
+            _is_platform_compatible(info, tags, include_sdist)
+            and not info.yanked
+            and (include_sdist or info.justuse.ext not in ("tar", "tar.gz" "zip"))
+        )
+
+    filtered = [release for release in releases if compatible(release, include_sdist=False)]
     if not filtered:
-        return [
-            release for release in releases if _is_compatible(release, platform_tags=tags, include_sdist=True)
-        ]
+        return [release for release in releases if compatible(release, include_sdist=True)]
     return filtered
 
 
@@ -872,15 +875,6 @@ def _is_platform_compatible(
     )
 
 
-@beartype
-def _is_compatible(info: PyPI_Release, platform_tags, include_sdist=False) -> bool:
-    return (
-        _is_platform_compatible(info, platform_tags, include_sdist)
-        and not info.yanked
-        and (include_sdist or info.justuse.ext not in ("tar", "tar.gz" "zip"))
-    )
-
-
 @beartype
 def _get_version(name: Optional[str] = None, package_name=None, /, mod=None) -> Optional[Version]:
     version: Optional[Union[Callable[...], Version, Version, str]] = None
@@ -994,11 +988,11 @@ def _real_path(*, path: Path, _applied_decorators: dict, landmark) -> tuple[str,
             else:
                 frame = frame.f_back
         # a few more steps..
-        for x in _applied_decorators:
+        for x in _applied_decorators[landmark]:
             frame = frame.f_back
         try:
-            # frame is in __call__ (or the last decorator we control), we need to step one more frame back
-            source_dir = Path(frame.f_back.f_code.co_filename).resolve().parent
+            # frame is in __call__ (or rather methdispatch), we need to step two frames back
+            source_dir = Path(frame.f_back.f_back.f_code.co_filename).resolve().parent
         # we are being called from a shell like thonny, so we have to assume cwd
         except OSError:
             source_dir = Path.cwd()
@@ -1036,3 +1030,144 @@ def _real_path(*, path: Path, _applied_decorators: dict, landmark) -> tuple[str,
     module_name = path.stem  # sic!
 
     return name, module_name, package_name, path
+
+
+numerics = [bool, Integral, Rational, Real, Complex]
+
+
+class NotComparableWarning(UserWarning):
+    pass
+
+
+def _modules_are_compatible(pre, post):
+    for name, pre_obj in pre.__dict__.items():
+        if callable(pre_obj):
+            try:
+                post_obj = getattr(post, name)
+            except AttributeError:
+                return False
+            if _is_compatible(pre_obj, post_obj):
+                continue
+            else:
+                return False
+    return True
+
+
+def _is_compatible(pre, post):
+    sig = inspect.signature(pre)
+    pre_sig = []
+    # first separate args and kwargs so we can sort kwargs alphabetically
+    args = []
+    kwargs = []
+
+    for k, v in sig.parameters.items():
+        if v.kind is v.VAR_KEYWORD or v.POSITIONAL_OR_KEYWORD:
+            kwargs.append((k, v))
+        else:
+            args.append((k, v))
+
+    for k, v in args:
+        v = v.annotation
+        pre_sig.append(v if v is not inspect._empty else Any)
+
+    for k, v in sorted(kwargs):
+        v = v.annotation
+        pre_sig.append(v if v is not inspect._empty else Any)
+
+    v = sig.return_annotation
+    pre_sig.append(v if v is not inspect._empty else Any)
+
+    sig = inspect.signature(post)
+    post_sig = []
+
+    args = []
+    kwargs = []
+
+    for k, v in sig.parameters.items():
+        if v.kind is v.VAR_KEYWORD or v.POSITIONAL_OR_KEYWORD:
+            kwargs.append((k, v))
+        else:
+            args.append((k, v))
+
+    for k, v in args:
+        v = v.annotation
+        post_sig.append(v if v is not inspect._empty else Any)
+
+    for k, v in sorted(kwargs):
+        v = v.annotation
+        post_sig.append(v if v is not inspect._empty else Any)
+
+    v = sig.return_annotation
+    post_sig.append(v if v is not inspect._empty else Any)
+    return all(_check(x, y) for x, y in zip_longest(pre_sig, post_sig, fillvalue=Any))
+
+
+def _check(x, y):
+    if config.debugging:
+        print(
+            f"checking:\n  "
+            f"{x!r:<30} "
+            f"({type(x).__module__}.{type(x).__qualname__})\n  "
+            f"{y!r:<30} "
+            f"({type(y).__module__}.{type(y).__qualname__})"
+        )
+
+    # narrowing {(Any => Any) | (Any => something)} is OK
+    if x is Any:
+        return True
+    # broadening (something => Any) is NOK
+    if y is Any:
+        return False
+
+    # now to the more specific cases (something => something else)
+    with contextlib.suppress(TypeError):  # issubclass is allergic to container classes (types.GenericAlias)
+        # let's first check if we're dealing with numbers
+        if issubclass(x, Number) and issubclass(y, Number):
+            # since the generic implementations aren't actual subclasses of each other
+            # we have to map to the numeric tower classes
+            for X in numerics:
+                if issubclass(x, X):
+                    break
+            x = X
+            for Y in numerics:
+                if issubclass(y, Y):
+                    break
+            y = Y
+    # Need to do this *before* we access `__name__`
+    X = get_origin(x) or x
+    Y = get_origin(y) or y
+
+    # the other important type hierarchy are
+    # containers
+    # let's check if the user is using typing
+    # classes and educate them to use
+    # collections.abc instead
+    for name, t in {"X": X, "Y": Y}.items():
+        if t.__module__ != "typing":
+            continue
+        tca = getattr(collections.abc, t.__name__, 0)
+        if not tca:
+            continue
+        warn(
+            NotComparableWarning(
+                f"{t} is of a type from the typing "
+                " module, which can't be compared. "
+                "Please use a type from the "
+                "`collections.abc` module (`{tca!r}`)."
+            )
+        )
+        locals().__setitem__(name, tca)
+
+    if X is not None and Y is not None:
+        # (Sequence => list) is OK, (list => Sequence) is NOK
+        return (
+            all(_check(x_, y_) for x_, y_ in zip_longest(get_args(x), get_args(y), fillvalue=Any))
+            if issubclass(Y, X)
+            else False
+        )
+
+    try:
+        # (x => y) where y is not a subclass of x is NOK
+        return issubclass(y, x)
+    except TypeError:  # (int => list[int]) or (list[int] => int) NOK
+        return False
diff --git a/src/use/pydantics.py b/src/use/pydantics.py
index c4bf81b9..2aceffd0 100644
--- a/src/use/pydantics.py
+++ b/src/use/pydantics.py
@@ -49,12 +49,19 @@ class Config:
         validate_assignment = True
 
 
+class git(BaseModel):
+    repo: str
+    host: str = "github.com"
+    branch: str = "main"
+    commit: Optional[str] = None
+
+
 class Version(PkgVersion):
-    def __new__(self, *args, **kwargs):
+    def __new__(cls, *args, **kwargs):
         if args and isinstance(args[0], Version):
             return args[0]
         else:
-            return super(self, Version).__new__(self)
+            return super(cls, Version).__new__(cls)
 
     def __init__(self, versionobj: Optional[Union[PkgVersion, str]] = None, *, major=0, minor=0, patch=0):
         if isinstance(versionobj, Version):
diff --git a/src/use/tools.py b/src/use/tools.py
index e29a929a..8c221b33 100755
--- a/src/use/tools.py
+++ b/src/use/tools.py
@@ -51,8 +51,6 @@ def wrapper(*args, **kwargs):
 
 
 def pipes(func_or_class):
-    from beartype import beartype
-
     if inspect.isclass(func_or_class):
         decorator_frame = inspect.stack()[1]
         ctx = decorator_frame[0].f_locals


Test patch:
diff --git a/src/.test8.py b/src/.test8.py
index 4eab8319..98027e11 100644
--- a/src/.test8.py
+++ b/src/.test8.py
@@ -1,143 +1,9 @@
-import inspect
-from typing import Any, get_args, get_origin
-from numbers import Number, Complex, Real, Rational, Integral
-from collections.abc import Sequence
-from itertools import zip_longest
-from warnings import warn
-import typing
-import collections
+import sys
 
+import numpy
+from beartype import beartype
 
-def test1(a, b, *, y:float, x:str):
-    return x
+import use
 
-def test2(a, b, *, x: str, y:float):
-    return x
-
-def test3(x: float):
-    return x
-
-def test4(x: int):
-    return x
-
-def test5(x: Sequence[int]):
-    return x
-
-def test6(x: list[int]):
-    return x
-
-def test7(x: typing.Sequence):
-    return x
-
-def test8(x: Sequence):
-    return x
-
-numerics = [bool, Integral, Rational, Real, Complex]
-
-class NotComparableWarning(UserWarning):
-    pass
-
-def is_compatible(pre, post):
-    sig = inspect.signature(pre)
-    pre_sig = []
-    # first separate args and kwargs so we can sort kwargs alphabetically
-    args = []
-    kwargs = []
-    
-    for k, v in sig.parameters.items():
-        if v.kind is v.VAR_KEYWORD or v.POSITIONAL_OR_KEYWORD:
-            kwargs.append((k,v))
-        else:
-            args.append((k,v))
-    
-    for k, v in args:
-        v = v.annotation
-        pre_sig.append(v if v is not inspect._empty else Any)
-    
-    for k, v in sorted(kwargs):
-        v = v.annotation
-        pre_sig.append(v if v is not inspect._empty else Any)
-        
-    v = sig.return_annotation
-    pre_sig.append(v if v is not inspect._empty else Any)
-    
-    sig = inspect.signature(post)
-    post_sig = []
-    
-    args = []
-    kwargs = []
-    
-    for k, v in sig.parameters.items():
-        if v.kind is v.VAR_KEYWORD or v.POSITIONAL_OR_KEYWORD:
-            kwargs.append((k,v))
-        else:
-            args.append((k,v))
-    
-    for k, v in args:
-        v = v.annotation
-        post_sig.append(v if v is not inspect._empty else Any)
-    
-    for k, v in sorted(kwargs):
-        v = v.annotation
-        post_sig.append(v if v is not inspect._empty else Any)
-    
-    v = sig.return_annotation
-    post_sig.append(v if v is not inspect._empty else Any)
-        
-    def check(x, y):
-        print(f"checking {x} {type(x)} => {y} {type(y)}")
-        if x is Any:
-            return True
-        if y is Any:
-            return False
-        # let's first check if we're dealing with numbers
-        try:
-            if issubclass(x, Number) and issubclass(y, Number):
-                # since the generic implementations aren't actual subclasses of each other
-                # we have to map to the numeric tower classes
-                for X in numerics:
-                    if issubclass(x, X):
-                        break
-                x = X
-                for Y in numerics:
-                    if issubclass(y, Y):
-                        break
-                y = Y
-        except TypeError:  # issubclass is allergic to container classes (types.GenericAlias)
-            pass
-
-        # the other important type hierarchy are containers
-        # let's check if the user is using typing classes and educate them to use collections.abc instead
-        if x.__module__ == "typing":
-            x = getattr(collections.abc, str(x).split(".")[-1])
-            warn(NotComparableWarning(f"{x} is of a type from the typing module, which can't be compared. Please use a type from collections.abc instead."))
-        if y.__module__ == "typing":
-            y = getattr(collections.abc, str(y).split(".")[-1])
-            warn(NotComparableWarning(f"{y} is of a type from the typing module, which can't be compared. Please use a type from collections.abc instead.")) 
-
-        X = get_origin(x)
-        Y = get_origin(y)
-        if X is not None and Y is not None:
-                    # (Sequence => list) is OK, (list => Sequence) is NOK
-            return (
-                all(
-                    check(x_, y_)
-                    for x_, y_ in zip_longest(
-                        get_args(x), get_args(y), fillvalue=Any
-                    )
-                )
-                if issubclass(Y, X)
-                else False
-            )
-
-        try:
-            # (x => y) where y is not a subclass of x is NOK
-            return issubclass(y, x)
-        except TypeError:  # (int => list[int]) or (list[int] => int) NOK
-            return False
-
-    return all(check(x, y) for x, y in zip_longest(pre_sig, post_sig, fillvalue=Any))
-        
-#print(is_compatible(test1, test2))
-#print(is_compatible(test5, test6))
-print(is_compatible(test1, test2))
+use.apply_aspect(use.iter_submodules(numpy), use.woody_logger)
+numpy.zeros((3, 3))
diff --git a/src/.test9.py b/src/.test9.py
new file mode 100644
index 00000000..7bb677d4
--- /dev/null
+++ b/src/.test9.py
@@ -0,0 +1,4 @@
+import use
+
+print(use.Path.cwd())
+mod = use(use.Path("tests/.tests/.file_for_test387.py"))
diff --git a/tests/.tests/.test0.py b/tests/.tests/.test0.py
index c8a78e52..0f8e1ca0 100644
--- a/tests/.tests/.test0.py
+++ b/tests/.tests/.test0.py
@@ -1,27 +1,58 @@
-import inspect, ast, dis
-
-
-def decorator(func):
-    def wrapper(x):
-        return func(x + 1)
-    return wrapper
-
-
-def test(x):
-    frame = inspect.currentframe()
-    while True:
-        if frame.f_code == a.__code__:
-            print(frame.f_code == a.__code__)
-            break
-        else:
-            frame = frame.f_back
-
-    return x**2
-
-
-def a():
-    test(2)
-    
-a()
-
-
+import ast
+import contextlib
+import sys
+from pathlib import Path
+
+from pprint import pprint
+
+import beartype
+import numpy
+
+
+def is_builtin(name, mod):
+    if name in sys.builtin_module_names:
+        return True
+
+    if hasattr(mod, "__file__"):
+        relpath = Path(mod.__file__).parent.relative_to((Path(sys.executable).parent / "lib"))
+        if relpath == Path():
+            return True
+        if relpath.parts[0] == "site-packages":
+            return False
+    return True
+
+
+def get_imports_from_module(mod):
+    if not hasattr(mod, "__file__"):
+        return
+    with open(mod.__file__, "rb") as file:
+        with contextlib.suppress(ValueError):
+            for x in ast.walk(ast.parse(file.read())):
+                if isinstance(x, ast.Import):
+                    name = x.names[0].name
+                    if (mod := sys.modules.get(name)) and not is_builtin(name, mod):
+                        yield name
+                if isinstance(x, ast.ImportFrom):
+                    name = x.module
+                    if (mod := sys.modules.get(name)) and not is_builtin(name, mod):
+                        yield name
+
+
+def get_submodules(mod, visited=None, results=None):
+    if results is None:
+        results = set()
+    if visited is None:
+        visited = set()
+    for name in get_imports_from_module(mod):
+        if name in visited:
+            continue
+        visited.add(name)
+        results.add(name)
+        for x in get_imports_from_module(sys.modules[name]):
+            results.add(x)
+            get_submodules(sys.modules[x], visited, results)
+    return results
+
+
+pprint(list(get_submodules(beartype)))
+print(len(get_submodules(beartype)))
diff --git a/tests/.tests/.test1.py b/tests/.tests/.test1.py
index 99537727..9003bb54 100644
--- a/tests/.tests/.test1.py
+++ b/tests/.tests/.test1.py
@@ -1,63 +1,52 @@
-import builtins
-import importlib
-import inspect
-from types import GetSetDescriptorType, MethodType
-
-imports = {}
-
-import inspect
-import sys
-
-sys_paths = {}
-
-
-class SysPath(list):
-    def append(self, item):
-        origin = inspect.currentframe().f_back.f_code.co_filename
-        print(origin, type(origin), sys_paths[origin])
-        if origin in sys_paths:
-            print("appending to other syspath", self, item)
-            sys_paths[origin].append(item)
-        else:
-            print("appending to original", item)
-            super().append(item)
-
-    def insert(self, item, position):
-        origin = inspect.currentframe().f_back.f_code.co_filename
-        print(origin)
-        if origin in sys_paths:
-            print("inserting to other syspath", item, position)
-            sys_paths[origin].insert(item, position)
-        else:
-            print("inserting to original", item, position)
-            super().insert(item, position)
-
-
-sys.path = SysPath(sys.path)
-
-sys_paths[r"F:\Dropbox (Privat)\code\justuse\tests\.tests\.test2.py"] = []
-
-
-def use(
-    name,
-    *args,
-    import_to_use=None,
-):
-
-    print("using:", name)
-    return importlib.import_module(name)
-
-
-def decorator(func):
-    def wrapper(name, *args):
-        to_use: str
-        if name in to_use:
-            return use(name, *args)
-        imports[name] = inspect.currentframe().f_back.f_code.co_filename
-        return func(name, *args)
-
+from collections.abc import Callable
+from functools import wraps
+from time import perf_counter_ns
+
+def _qualname(thing):
+    module = getattr(thing, "__module__", None) or getattr(thing.__class__, "__module__", None)
+    qualname = getattr(thing, "__qualname__", None) or getattr(thing, "__name__", None) or str(thing)
+    return f"{module}::{qualname}"
+
+def woody_logger(thing: Callable) -> Callable:
+    """
+    Decorator to log/track/debug calls and results.
+
+    Args:
+        func (function): The function to decorate.
+    Returns:
+        function: The decorated callable.
+    """
+    if type(thing) is type:
+        class wrapper(thing.__class__):
+            def __new__(cls, *args, **kwargs):
+                print(f"{args} {kwargs} -> {thing.__name__}()")
+                before = perf_counter_ns()
+                res = thing(*args, **kwargs)
+                after = perf_counter_ns()
+                print(
+                    f"-> {thing.__name__}() (in {after - before} ns ({round((after - before) / 10**9, 5)} sec) -> {type(res)}"
+                )
+                return res
+    else:
+        @wraps(thing)
+        def wrapper(*args, **kwargs):
+            print(f"{args} {kwargs} -> {_qualname(func)}")
+            before = perf_counter_ns()
+            res = func(*args, **kwargs)
+            after = perf_counter_ns()
+            print(
+                f"-> {_qualname(func)} (in {after - before} ns ({round((after - before) / 10**9, 5)} sec) -> {res} {type(res)}"
+            )
+            return res
     return wrapper
 
 
-builtins.__import__ = decorator(__import__)
-use("numpy", import_to_use=["re"])
+@woody_logger
+class Test:
+    def foo(self):
+        print(1)
+    
+    def bar(self):
+        print(2)
+
+t = Test()
diff --git a/tests/.tests/.test3.py b/tests/.tests/.test3.py
index 2a89caf7..53b990d0 100644
--- a/tests/.tests/.test3.py
+++ b/tests/.tests/.test3.py
@@ -1,1 +1,8 @@
-print("adsf".translate({ord("a"): ord("b")}))
\ No newline at end of file
+import traceback
+
+try:
+    assert False, "foobar"
+except AssertionError as exc:
+    print(exc.__class__.__name__, exc)
+
+#print(traceback.format_exception_only(exc, AssertionError))
\ No newline at end of file
diff --git a/tests/test.py b/tests/test.py
index 9ab79a9c..f3bf8682 100644
--- a/tests/test.py
+++ b/tests/test.py
@@ -1,4 +1,7 @@
-s = 'abcdefgabcd'
-set(s)
+import requests
+from pprint import pprint
 
-print(''.join(x for x in s if x not in set(s)))
\ No newline at end of file
+owner = "amogorkon"
+repo = "justuse"
+url = f"https://api.github.com/repos/{owner}/{repo}/commits"
+pprint(requests.get(url).json())
\ No newline at end of file
diff --git a/tests/unit_test.py b/tests/unit_test.py
index 609dc582..8603f821 100755
--- a/tests/unit_test.py
+++ b/tests/unit_test.py
@@ -4,8 +4,9 @@
 import subprocess
 import sys
 import tempfile
+import typing
 import warnings
-from collections.abc import Callable
+from collections.abc import Callable, Sequence
 from contextlib import AbstractContextManager, closing, redirect_stdout
 from datetime import datetime
 from hashlib import sha256
@@ -34,9 +35,9 @@
 import logging
 
 from use import auto_install, fatal_exceptions, no_cleanup, use
-from use.aspectizing import _unwrap, _wrap
+from use.aspectizing import _unwrap, _wrap, iter_submodules
 from use.hash_alphabet import JACK_as_num, hexdigest_as_JACK, is_JACK, num_as_hexdigest
-from use.pimp import _get_data_from_pypi, _is_version_satisfied, _parse_name
+from use.pimp import _check, _get_data_from_pypi, _is_compatible, _is_version_satisfied, _parse_name
 from use.pydantics import JustUse_Info, PyPI_Project, PyPI_Release, Version
 
 log = logging.getLogger(".".join((__package__, __name__)))
@@ -409,8 +410,9 @@ def test_85_pywt_jupyter_ubuntu_case1010(reuse, name, version, hashes):
 
 
 def test_387_usepath_filename(reuse):
-    mod = use(use.Path(".tests/.file_for_test387.py"))
-    assert mod
+    with ScopedCwd(Path(__file__).parent):
+        mod = use(use.Path(".tests/.file_for_test387.py"))
+        assert mod
 
 
 def test_hash_alphabet():
@@ -700,3 +702,67 @@ def test_454_no_tags(reuse):
             name, version=version, hashes={recommended_hash}, modes=reuse.auto_install | reuse.no_cleanup
         )
         assert mod
+
+
+def test_same_signature_different_kwarg_order():
+    def f1(a, b, *, y: float, x: str):
+        return x
+
+    def f2(a, b, *, x: str, y: float):
+        return x
+
+    assert _is_compatible(f1, f2)
+    assert _is_compatible(f2, f1)
+
+
+def test_float_to_int():
+    def f3(x: float):
+        return x
+
+    def f4(x: int):
+        return x
+
+    assert _is_compatible(f3, f4)
+    assert not _is_compatible(f4, f3)
+
+
+def test_sequence_to_list():
+    def f5(x: Sequence[int]):
+        return x
+
+    def f6(x: list[int]):
+        return x
+
+    def f7(x: typing.Sequence):
+        return x
+
+    def f8(x: Sequence):
+        return x
+
+    assert _is_compatible(f5, f6)
+    assert not _is_compatible(f6, f5)
+
+
+# assert _is_compatible(f7, f8)
+# assert not _is_compatible(f8, f7)
+
+
+def test_signature_compatibility():
+    assert _check(list, typing.List[int])
+    assert _check(Sequence[int], list[int])
+    assert not _check(list, typing.Sequence)
+    assert not _check(list, typing.Sequence[int])
+    assert _check(list[int], typing.List[int])
+    assert _check(list, list[int])
+    assert not _check(list[int], Sequence[int])
+    assert not _check(list[int], typing.Sequence)
+    assert not _check(list[int], typing.Sequence[int])
+    assert not _check(typing.List[int], Sequence[int])
+    assert not _check(typing.List[int], typing.Sequence)
+    assert not _check(typing.List[int], typing.Sequence[int])
+    assert not _check(Sequence[int], typing.Sequence)
+    assert _check(Sequence[int], typing.Sequence[int])
+
+
+def test_dependencies():
+    iter_submodules
\ No newline at end of file