{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Quick Start Tutorial" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A simple step-by-step guide that will quickly get you started with Hangar basics, including initializing a repository, adding and committing data to a repository." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Installation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can install Hangar via `pip`:\n", "\n", "```\n", "$ pip install hangar\n", "```\n", "\n", "or via `conda`:\n", "\n", "```\n", "$ conda install -c conda-forge hangar\n", "```\n", "\n", "Please refer to the [Installation](installation.rst) page for more information." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Quick Start for the Impatient" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The only import statement you'll ever need:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from hangar import Repository" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create and initialize a new Hangar `Repository` at the given path:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hangar Repo initialized at: /Volumes/Archivio/tensorwerk/hangar/quick-start/.hangar\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "//anaconda/envs/hangar-tutorial/lib/python3.8/site-packages/hangar/context.py:92: UserWarning: No repository exists at /Volumes/Archivio/tensorwerk/hangar/quick-start/.hangar, please use `repo.init()` method\n", " warnings.warn(msg, UserWarning)\n" ] }, { "data": { "text/plain": [ "'/Volumes/Archivio/tensorwerk/hangar/quick-start/.hangar'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "!mkdir /Volumes/Archivio/tensorwerk/hangar/quick-start\n", "\n", "repo = Repository(path=\"/Volumes/Archivio/tensorwerk/hangar/quick-start\")\n", "\n", "repo.init(\n", " user_name=\"Alessia Marcolini\", user_email=\"alessia@tensorwerk.com\", remove_old=True\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Checkout the `Repository` in write mode:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Hangar WriterCheckout \n", " Writer : True \n", " Base Branch : master \n", " Num Columns : 0\n" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "master_checkout = repo.checkout(write=True)\n", "master_checkout" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Inspect the `columns` we have (we just started, none so far):" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Hangar Columns \n", " Writeable : True \n", " Number of Columns : 0 \n", " Column Names / Partial Remote References: \n", " - " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "master_checkout.columns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Prepare some random data to play with:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0.17961852, 0.31945355],\n", " [0.10929027, 0.2681622 ],\n", " [0.29397449, 0.02659856]])" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "\n", "dummy = np.random.rand(3,2)\n", "dummy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a new column named `dummy_column`:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Hangar FlatSampleWriter \n", " Column Name : dummy_column \n", " Writeable : True \n", " Column Type : ndarray \n", " Column Layout : flat \n", " Schema Type : fixed_shape \n", " DType : float64 \n", " Shape : (3, 2) \n", " Number of Samples : 0 \n", " Partial Remote Data Refs : False\n" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dummy_col = master_checkout.add_ndarray_column(name=\"dummy_column\", prototype=dummy)\n", "dummy_col" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Add data to `dummy_column`, treating it as a normal Python dictionary:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "dummy_col[0] = dummy" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "dummy_col[1] = np.random.rand(3,2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Commit your changes providing a message:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'a=c104ef7e2cfe87318e78addd6033028488050cea'" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "master_checkout.commit(\"Add dummy_column with 2 samples\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Add more data and commit again:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Hangar FlatSampleWriter \n", " Column Name : dummy_column \n", " Writeable : True \n", " Column Type : ndarray \n", " Column Layout : flat \n", " Schema Type : fixed_shape \n", " DType : float64 \n", " Shape : (3, 2) \n", " Number of Samples : 3 \n", " Partial Remote Data Refs : False\n" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dummy_col[2] = np.random.rand(3,2)\n", "dummy_col" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'a=099557d48edebb7607fa3ec648eafa2a1af5e652'" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "master_checkout.commit(\"Add one more sample to dummy_column\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "See the master branch history:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "* a=099557d48edebb7607fa3ec648eafa2a1af5e652 (\u001B[1;31mmaster\u001B[m) : Add one more sample to dummy_column\n", "* a=c104ef7e2cfe87318e78addd6033028488050cea : Add dummy_column with 2 samples\n" ] } ], "source": [ "master_checkout.log()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Close the write-enabled checkout:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "master_checkout.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Inspect the status of the `Repository`:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Summary of Contents Contained in Data Repository \n", " \n", "================== \n", "| Repository Info \n", "|----------------- \n", "| Base Directory: /Volumes/Archivio/tensorwerk/hangar/quick-start \n", "| Disk Usage: 237.53 kB \n", " \n", "=================== \n", "| Commit Details \n", "------------------- \n", "| Commit: a=099557d48edebb7607fa3ec648eafa2a1af5e652 \n", "| Created: Mon May 4 13:00:43 2020 \n", "| By: Alessia Marcolini \n", "| Email: alessia@tensorwerk.com \n", "| Message: Add one more sample to dummy_column \n", " \n", "================== \n", "| DataSets \n", "|----------------- \n", "| Number of Named Columns: 1 \n", "|\n", "| * Column Name: ColumnSchemaKey(column=\"dummy_column\", layout=\"flat\") \n", "| Num Data Pieces: 3 \n", "| Details: \n", "| - column_layout: flat \n", "| - column_type: ndarray \n", "| - schema_hasher_tcode: 1 \n", "| - data_hasher_tcode: 0 \n", "| - schema_type: fixed_shape \n", "| - shape: (3, 2) \n", "| - dtype: float64 \n", "| - backend: 01 \n", "| - backend_options: {'complib': 'blosc:lz4hc', 'complevel': 5, 'shuffle': 'byte'} \n", "\n" ] } ], "source": [ "repo.summary()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "### Quick Start - with explanations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1. Create and initialize a \"Repository\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Central to Hangar is the concept of [Repository](api.rst#hangar.repository.Repository).\n", "\n", "A `Repository` consists of an **historically ordered mapping** of **Commits** over time by various **Committers** across any number of **Branches**. Though there are many conceptual similarities in what a Git repo and a Hangar repository achieve, Hangar is designed with the express purpose of dealing with **numeric data**.\n", "\n", "To start using Hangar programmatically, simply begin with this import statement:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from hangar import Repository" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create the folder where you want to store the `Repository`:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "!mkdir /Volumes/Archivio/tensorwerk/hangar/quick-start" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Initialize the `Repository` object by saying where your repository should live.\n", "\n", ".. note:: Note that if you feed a path to the `Repository` which does not contain a pre-initialized Hangar repo, Python shows you a warning saying that you will need to initialize the repo before starting working on it." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "//anaconda/envs/hangar-tutorial/lib/python3.8/site-packages/hangar/context.py:92: UserWarning: No repository exists at /Volumes/Archivio/tensorwerk/hangar/quick-start/.hangar, please use `repo.init()` method\n", " warnings.warn(msg, UserWarning)\n" ] } ], "source": [ "repo = Repository(path=\"/Volumes/Archivio/tensorwerk/hangar/quick-start\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Initialize the `Repository` providing your name and your email.\n", "\n", ".. warning:: Please be aware that the `remove_old` parameter set to `True` **removes and reinitializes** a Hangar repository at the given path." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hangar Repo initialized at: /Volumes/Archivio/tensorwerk/hangar/quick-start/.hangar\n" ] }, { "data": { "text/plain": [ "'/Volumes/Archivio/tensorwerk/hangar/quick-start/.hangar'" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "repo.init(\n", " user_name=\"Alessia Marcolini\", user_email=\"alessia@tensorwerk.com\", remove_old=True\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2. Open the Staging Area for Writing\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To start interacting with Hangar, first you need to check out the `Repository` you want to work on.\n", "\n", "A repo can be checked out in two modes:\n", "\n", "* [write-enabled](api.rst#hangar.checkout.WriterCheckout)\n", "* [read-only](api.rst#hangar.checkout.ReaderCheckout)\n", "\n", "We need to check out the repo in **write mode** in order to initialize the columns and write into them." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Hangar WriterCheckout \n", " Writer : True \n", " Base Branch : master \n", " Num Columns : 0\n" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "master_checkout = repo.checkout(write=True)\n", "master_checkout" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A checkout allows access to `columns`. The `columns` attribute of a checkout provide the interface to working with all of the data on disk!" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Hangar Columns \n", " Writeable : True \n", " Number of Columns : 0 \n", " Column Names / Partial Remote References: \n", " - " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "master_checkout.columns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 3. Create some random data to play with" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's create a random array to be used as a dummy example:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0.54631485, 0.26578857],\n", " [0.74990074, 0.41764666],\n", " [0.75884524, 0.05547267]])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "\n", "dummy = np.random.rand(3,2)\n", "dummy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 4. Initialize a column" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With checkout write-enabled, we can now initialize a new column of the repository using the method [add_ndarray_column()](api.rst#hangar.checkout.WriterCheckout.add_ndarray_column).\n", "\n", "All samples within a column have the same data type, and number of dimensions. The size of each dimension can be either fixed (the default behavior) or variable per sample.\n", "\n", "You will need to provide a column name and a prototype, so Hangar can infer the shape of the elements contained in the array. `dummy_col` will become a column accessor object." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Hangar FlatSampleWriter \n", " Column Name : dummy_column \n", " Writeable : True \n", " Column Type : ndarray \n", " Column Layout : flat \n", " Schema Type : fixed_shape \n", " DType : float64 \n", " Shape : (3, 2) \n", " Number of Samples : 0 \n", " Partial Remote Data Refs : False\n" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dummy_col = master_checkout.add_ndarray_column(name=\"dummy_column\", prototype=dummy)\n", "dummy_col" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Verify we successfully added the new column:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Hangar Columns \n", " Writeable : True \n", " Number of Columns : 1 \n", " Column Names / Partial Remote References: \n", " - dummy_column / False" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "master_checkout.columns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 5. Add data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To add data to a named column, we can use **dict-style mode** as follows.\n", "Sample keys can be either str or int type." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "dummy_col[0] = dummy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we can see, `Number of Samples` is equal to 1 now!" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Hangar FlatSampleWriter \n", " Column Name : dummy_column \n", " Writeable : True \n", " Column Type : ndarray \n", " Column Layout : flat \n", " Schema Type : fixed_shape \n", " DType : float64 \n", " Shape : (3, 2) \n", " Number of Samples : 1 \n", " Partial Remote Data Refs : False\n" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dummy_col" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "dummy_col[1] = np.random.rand(3,2)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Hangar FlatSampleWriter \n", " Column Name : dummy_column \n", " Writeable : True \n", " Column Type : ndarray \n", " Column Layout : flat \n", " Schema Type : fixed_shape \n", " DType : float64 \n", " Shape : (3, 2) \n", " Number of Samples : 2 \n", " Partial Remote Data Refs : False\n" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dummy_col" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0.17590758, 0.26950355],\n", " [0.88036219, 0.7839301 ],\n", " [0.87321484, 0.04316646]])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dummy_col[1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also iterate over your column, as you would do with a regular Python dictionary:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Key: 0\n", "Value: [[0.54631485 0.26578857]\n", " [0.74990074 0.41764666]\n", " [0.75884524 0.05547267]]\n", "\n", "Key: 1\n", "Value: [[0.17590758 0.26950355]\n", " [0.88036219 0.7839301 ]\n", " [0.87321484 0.04316646]]\n", "\n" ] } ], "source": [ "for key, value in dummy_col.items():\n", " print('Key:', key)\n", " print('Value:', value)\n", " print()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**How many samples are in the column?**" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(dummy_col)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Does the column contain that key?**" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "0 in dummy_col" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "5 in dummy_col" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 6. Commit changes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Once you have made a set of changes you want to **commit**, just simply call the [commit()](api.rst#hangar.checkout.WriterCheckout.commit) method (and pass in a message)!" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'a=4f42fce2b66476271f149e3cd2eb4c6ba66daeee'" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "master_checkout.commit(\"Add dummy_column with 2 samples\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's add another sample in the column:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Hangar FlatSampleWriter \n", " Column Name : dummy_column \n", " Writeable : True \n", " Column Type : ndarray \n", " Column Layout : flat \n", " Schema Type : fixed_shape \n", " DType : float64 \n", " Shape : (3, 2) \n", " Number of Samples : 3 \n", " Partial Remote Data Refs : False\n" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dummy_col[2] = np.random.rand(3,2)\n", "dummy_col" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`Number of Samples` is equal to 3 now and we want to keep track of the change with another commit:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'a=753e28e27d4b23a0dca0633f90b4513538a98c40'" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "master_checkout.commit(\"Add one more sample to dummy_column\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To view the **history** of your commits:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "* a=753e28e27d4b23a0dca0633f90b4513538a98c40 (\u001B[1;31mmaster\u001B[m) : Add one more sample to dummy_column\n", "* a=4f42fce2b66476271f149e3cd2eb4c6ba66daeee : Add dummy_column with 2 samples\n" ] } ], "source": [ "master_checkout.log()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Do not forget to close the write-enabled checkout!**" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "master_checkout.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Check the **state of the repository** and get useful information about disk usage, the columns you have and the last commit:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Summary of Contents Contained in Data Repository \n", " \n", "================== \n", "| Repository Info \n", "|----------------- \n", "| Base Directory: /Volumes/Archivio/tensorwerk/hangar/quick-start \n", "| Disk Usage: 237.53 kB \n", " \n", "=================== \n", "| Commit Details \n", "------------------- \n", "| Commit: a=753e28e27d4b23a0dca0633f90b4513538a98c40 \n", "| Created: Tue Apr 21 21:50:15 2020 \n", "| By: Alessia Marcolini \n", "| Email: alessia@tensorwerk.com \n", "| Message: Add one more sample to dummy_column \n", " \n", "================== \n", "| DataSets \n", "|----------------- \n", "| Number of Named Columns: 1 \n", "|\n", "| * Column Name: ColumnSchemaKey(column=\"dummy_column\", layout=\"flat\") \n", "| Num Data Pieces: 3 \n", "| Details: \n", "| - column_layout: flat \n", "| - column_type: ndarray \n", "| - schema_hasher_tcode: 1 \n", "| - data_hasher_tcode: 0 \n", "| - schema_type: fixed_shape \n", "| - shape: (3, 2) \n", "| - dtype: float64 \n", "| - backend: 01 \n", "| - backend_options: {'complib': 'blosc:lz4hc', 'complevel': 5, 'shuffle': 'byte'} \n", "\n" ] } ], "source": [ "repo.summary()" ] } ], "metadata": { "hide_input": false, "kernelspec": { "display_name": "Python (hangar-tutorial)", "language": "python", "name": "hangar-tutorial" }, "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.2" }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }