{ "info": { "author": "Ge Yang", "author_email": "yangge1987@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Science/Research", "Programming Language :: Python :: 3" ], "description": "``params-proto``, A Python Decorator That Gives Your Model Parameters Super-power\n=================================================================================\n\n- 2019/06/11: Now supports ``tab-completion`` at the command line!\n- 2018/11/08: Now supports both python ``3.52`` as well as ``3.6``!\n :bangbang::star:\n\nWhat is \u201cExperiment Parameter Hell\u201d?\n------------------------------------\n\n\u201cExperiemnt Parameter Hell\u201d occurs when you have more than twenty\nparameters for your ML project that are all defined as string/function\nparameters with ``click`` or ``argparse``. Sometimes these parameters\nare defined in a launch script and passes through five layers of\nfunction calls during an experiment.\n\nYour Python IDEs work very hard on static code-block analysis to intelligently\nmake you more productive, and the \u201cparameter hell\u201d breaks all of that.\n\nIn your ML project, you want to avoid using dictionaries or opaque\nargparse definitions as much as you can. You want to write those\nparameters **declaratively** instead. This way, your IDE can actually\nhelp you navigate through those layers of function calls.\n\nWriting documentation as uhm\u2026, man page?\n----------------------------------------\n\n``Params-Proto`` exposes your argument namespace\u2019s doc string as the\nusage note. For users of your code-block, there is no better help than the one\nthat comes with the script itself!\n\n With ``params-proto``, your help is only one ``-h`` away :)\n\nAnd **Your code-block becomes the documentation.**\n\nWhy Use Params_Proto Instead of Click or Argparse?\n--------------------------------------------------\n\n**Because this is declarative**, which makes it easy to refactor your\ncode-block and find variable references.\n\n- You want to place all of the arguments under a namespace that can be\n statically checked.\n- This allows your IDE to:\n\n 1. Find usage of each argument\n 2. jump from *anywhere* in your code-block base to the declaration of that\n argument\n 3. refactor your argument name **in the entire code-block base**\n automatically\n\n``Params_proto`` is the declarative way to write command line arguments,\nand is the way to go for ML projects.\n\nTab-completion for your script!\n-------------------------------\n\n``params_proto`` uses ``argparse`` together with ``argcomplete``, which\nenables command line autocomplete on tabs! To enable run\n\n.. code-block:: python\n\n pip install params-proto\n # then:\n activate-global-python-argcomplete\n\nFor details, see ```argcomplete``\\ \u2019s\ndocumentation `__.\n\nSimple Example (with batteries included!!):battery:\n---------------------------------------------------\n\n.. code-block:: python\n\n # this.code-block.py\n from params_proto import cli_parse, BoolFlag, Proto\n\n @cli_parse\n class Args:\n \"\"\"\n [README]\n Generator for the 2D Particle Map Dataset. See Usage help below:\n \"\"\"\n load = Proto(None, dtype=str, help=\"to visualize existing data located at this path\")\n x_dim = Proto(2, help=\"The dimension for the observation space\")\n data_size = Proto(20, help=\"The size of the dataset. Note we x2 because we generate transitions.\")\n show_plot = BoolFlag(True, help=\"Shows the plot when true.\")\n\n def train():\n D = Discriminator(Args.x_dim)\n\n def launch(**kwargs):\n Args.update(kwargs)\n\n if __name__ == \"__main__\":\n launch(show_plot=True)\n\nnow, if you run this code-block, it gives you this help in the command line:\n\n.. code-block:: python\n\n (/Users/ge/anaconda/envs/some-project) \u279c git:(master) python -m this.code-block.py -h\n usage: generate.py [-h] [--load LOAD] [--x-dim X_DIM] [--data-size DATA_SIZE]\n [--show-plot]\n\n [README] Generator for the 2D Particle Map Dataset. See Usage help below:\n\n optional arguments:\n -h, --help show this help message and exit\n --load LOAD to visualize existing data located at this path\n --x-dim X_DIM The dimension for the observation space\n --data-size DATA_SIZE\n The size of the dataset. Note we x2 because we\n generate transitions.\n --show-plot Shows the plot when true.\n\nNow, isn\u2019t this awesome? :bang::stars:\n\nHow to override when calling from python\n----------------------------------------\n\nIt is very easy to over-ride the parameters when you call your function:\nhave most of your training code-block **directly** reference the parser\nnamespace (your configuration namespace really), and just monkey patch\nthe attribute.\n\n``params-proto`` works very well with the clound ML launch tool\n`jaynes `__. Take a look at the\nautomagic awesomeness of\n`jaynes `__:)\n\nTodo\n----\n\nDone\n~~~~\n\n- \u2612 publish\n- \u2612 add test\n- \u2612 add ``python3.52`` test on top of ``python3.6`` test.\n\nInstallation\n------------\n\n.. code-block:: bash\n\n pip install params-proto\n\nUsage\n-----\n\nTo use a python namespace to declare commandline argments\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n**Updated** We now use a ``Proto`` helper function to declare the\nargparse arguments! See example below:\n\nSimple example showing how to use python namespace to declare command line arguments:\n-------------------------------------------------------------------------------------\n\n**note**: for boolean, use ``bool`` or ``\"bool\"``. ``params_proto`` will\nautomatically use ``distutils.util.strtobool`` to parse it into\n``bool``. Details look\n`here `__\n\n.. code-block:: python\n\n from .params_proto import cli_parse, is_hidden, Proto, ParamsProto, proto_signature\n\n\n def test_cli_proto():\n @cli_parse\n class G(ParamsProto):\n \"\"\"Supervised MAML in tensorflow\"\"\"\n npts = Proto(100, help=\"number of points to sample from distribution\")\n num_epochs = Proto(70000, help=\"number of epochs to train\")\n num_tasks = Proto(10, help=\"number of tasks in the inner loop\")\n num_grad_steps = Proto(1, help=\"number of gradient descent steps in the inner loop\")\n num_points_sampled = Proto(10, help=\"effectively the k-shot\")\n eval_grad_steps = Proto([0, 1, 10], type=bool, help=\"the grad steps evaluated with full sample\")\n fix_amp = Proto(False, help=\"controls the sampling, fix the amplitude of the sample distribution if True\")\n\n assert G.npts == 100\n G.npts = 10\n assert G.npts == 10\n assert vars(G) == {'npts': 10, 'num_epochs': 70000, 'num_tasks': 10, 'num_grad_steps': 1,\n 'num_points_sampled': 10, 'fix_amp': False,\n 'eval_grad_steps': [0, 1, 10]}\n assert G._proto is not None, '_proto should exist'\n\nSetting Function Signatures using Python Namespace\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nsometimes, you have a function with wildcard keyword argument signature.\nIt is annoying to work with such functions because the static type\nanalysis of the IDE doesn\u2019t tell you what needs to go in.\n\nI originally wrote this decorator to help with that case, however the\ndynamically set function signature won\u2019t show up in the IDE in general.\nUse this for inspection purposes if you like.\n\nBelow si the usage example and the test case:\n\n.. code-block:: python\n\n def test_proto_signature():\n @cli_parse\n class G(ParamsProto):\n \"\"\"some parameter proto\"\"\"\n n = 1\n npts = Proto(100, help=\"number of points to sample from distribution\")\n ok = True\n\n @proto_signature(G._proto)\n def main_demo(**kwargs):\n print('npts = ', kwargs['npts'])\n return kwargs['npts']\n\n # First way is to use proto_signature decorator. The dynamically generated signature\n # however does not show up in pyCharm. It does however, show during run time.\n import inspect\n\n assert main_demo(npts=10) == 10\n print(\"main_demo signature:\", inspect.signature(main_demo))\n assert str(inspect.signature(main_demo)) == \"(n=1, npts=100, ok=True)\"\n\nTo Develop\n----------\n\n.. code-block:: bash\n\n git clone https://github.com/episodeyang/params_proto.git\n cd params_proto\n make dev\n\nTo test, run the following under both python ``3.52`` and ``3.6``.\n\n.. code-block:: bash\n\n make test\n\nThis ``make dev`` command should build the wheel and install it in your\ncurrent python environment. Take a look at the\n`https://github.com/episodeyang/params_proto/blob/master/Makefile `__ for details.\n\n**To publish**, first update the version number, then do:\n\n.. code-block:: bash\n\n make publish\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/episodeyang/params_proto", "keywords": "params_proto,decorator,argparse,argcomplete,auto-completion,autocomplete,shell arguments,argument parser", "license": "", "maintainer": "", "maintainer_email": "", "name": "params-proto", "package_url": "https://pypi.org/project/params-proto/", "platform": "", "project_url": "https://pypi.org/project/params-proto/", "project_urls": { "Homepage": "https://github.com/episodeyang/params_proto" }, "release_url": "https://pypi.org/project/params-proto/2.4.0/", "requires_dist": [ "waterbear", "argparse", "argcomplete", "typing" ], "requires_python": "", "summary": "A command line argument parsing utility using python class-based namespace for better IDE static auto-completion", "version": "2.4.0" }, "last_serial": 5389007, "releases": { "0.0.0": [ { "comment_text": "", "digests": { "md5": "7ce5c6d8ab460865a424d2548ee2944f", "sha256": "21c7195c6876d6fd4d56cf576af9e4f1ec5dbedc1ab50a0408550fd74f74bb73" }, "downloads": -1, "filename": "params_proto-0.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "7ce5c6d8ab460865a424d2548ee2944f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4515, "upload_time": "2017-09-06T09:43:00", "url": "https://files.pythonhosted.org/packages/fa/74/04a4b763d1afdf81a2555ef1249b5922191af106bc7d3c8d0002cae8dc27/params_proto-0.0.0-py3-none-any.whl" } ], "0.0.1": [ { "comment_text": "", "digests": { "md5": "a9cde59f6dbece820a1ee3645d0d4f07", "sha256": "5879086f6752e5caba4ec245e83d374efca60423407c59c72635f4c929516294" }, "downloads": -1, "filename": "params_proto-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "a9cde59f6dbece820a1ee3645d0d4f07", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4575, "upload_time": "2017-09-06T09:48:22", "url": "https://files.pythonhosted.org/packages/ec/77/b8f83ac0253b5eb8eff2e23ae29b1faa16c7a8fdfc7a9c5db9cd6d5aa16a/params_proto-0.0.1-py3-none-any.whl" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "c23089ce502db72b8fdedb5184a56af0", "sha256": "689fe88a3becdf8a5ae9aa4104e939a9a0c4f21719b983082e7ec2ee4158a1da" }, "downloads": -1, "filename": "params_proto-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "c23089ce502db72b8fdedb5184a56af0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4584, "upload_time": "2017-09-06T20:31:38", "url": "https://files.pythonhosted.org/packages/4d/b6/9ebd9fc1047c342a53af784f9556cfc7661756567e1766571a6ace40d260/params_proto-0.5.0-py3-none-any.whl" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "2c1f3cecb832191a03be0d19be387d87", "sha256": "9f621c6ac8cd3291e8b81094605f26ea6299eb8345424b103c31f6f01d522b5c" }, "downloads": -1, "filename": "params_proto-0.5.2-py3-none-any.whl", "has_sig": false, "md5_digest": "2c1f3cecb832191a03be0d19be387d87", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6836, "upload_time": "2017-09-07T06:31:11", "url": "https://files.pythonhosted.org/packages/29/67/c7f6d811f1e5de4b6f1080ca250f13720ab46381ea944a07a3dde40570b8/params_proto-0.5.2-py3-none-any.whl" } ], "0.5.3": [ { "comment_text": "", "digests": { "md5": "76c8c36a69aa0f92bd241491fb18b8ec", "sha256": "abec10e1d0ef2e53737ac28452041ea1d4adf69e1e01ded68b028f5176433bfa" }, "downloads": -1, "filename": "params_proto-0.5.3-py3-none-any.whl", "has_sig": false, "md5_digest": "76c8c36a69aa0f92bd241491fb18b8ec", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6904, "upload_time": "2017-09-07T06:42:05", "url": "https://files.pythonhosted.org/packages/9e/9c/86a40e0e822ce6ea10983e91a6929671299baf25d592f8aaf1e9fe16762d/params_proto-0.5.3-py3-none-any.whl" } ], "0.5.4": [ { "comment_text": "", "digests": { "md5": "0672cbedbba6fca1ad91eb860f824d19", "sha256": "7a6eccd2dd34bb1b8188d88ea8f20486666b42669ab6ea8c102c3fefe3839115" }, "downloads": -1, "filename": "params_proto-0.5.4-py3-none-any.whl", "has_sig": false, "md5_digest": "0672cbedbba6fca1ad91eb860f824d19", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6947, "upload_time": "2017-09-07T06:44:16", "url": "https://files.pythonhosted.org/packages/5b/93/544b36275f4fe4b94b67df38ddd1701e9e411f98dc6358aaa41aa6cbbd52/params_proto-0.5.4-py3-none-any.whl" } ], "0.5.5": [ { "comment_text": "", "digests": { "md5": "3b390d2eab8bfdb08892b2750441fbbd", "sha256": "800f9fc17951da26951f5aff4dfce8627c38b075aab8dcbeb0e9f29c541462e2" }, "downloads": -1, "filename": "params_proto-0.5.5-py3-none-any.whl", "has_sig": false, "md5_digest": "3b390d2eab8bfdb08892b2750441fbbd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6950, "upload_time": "2017-09-07T06:47:22", "url": "https://files.pythonhosted.org/packages/9a/46/d77611cb506d115dc3f1ce45e7cd19023fde65ff3377c249a844b0122174/params_proto-0.5.5-py3-none-any.whl" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "454a0e0231264d5dd56348014b894b3f", "sha256": "996599832a414506029e1afbe57f8e814389f3a4b8432c610743414f6b93ea84" }, "downloads": -1, "filename": "params_proto-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "454a0e0231264d5dd56348014b894b3f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7872, "upload_time": "2017-09-07T19:07:59", "url": "https://files.pythonhosted.org/packages/43/c8/6f339e34530d0a89872e58aa7cb30b686e1d5ad3efb5e43c44a85a0dfa87/params_proto-1.0.0-py3-none-any.whl" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "bc1b5a80aeb3788b3a12940d5c199af2", "sha256": "b3ca2df925b8e8ed1e2db7e69a55e709ae37cd542a14780caf604cde3953ecad" }, "downloads": -1, "filename": "params_proto-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "bc1b5a80aeb3788b3a12940d5c199af2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8342, "upload_time": "2017-09-08T00:22:23", "url": "https://files.pythonhosted.org/packages/c7/2b/79ee3012215c565dae0386f53f9d4532aeb35558ee4cb28b038f0e7c2a9e/params_proto-1.1.0-py3-none-any.whl" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "5dd8abb02f37da62d856f316020b0ab3", "sha256": "2f045041f771cef682756a5c5ed14d471577e669338d681c9fb8fdd05c79117f" }, "downloads": -1, "filename": "params_proto-1.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "5dd8abb02f37da62d856f316020b0ab3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8374, "upload_time": "2017-09-11T01:47:29", "url": "https://files.pythonhosted.org/packages/eb/a5/08d4f97b19363f6378f8da2db485def80a0a03628a2259005cdf807680ab/params_proto-1.1.1-py3-none-any.whl" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "91dff481d2450ffa129dc89162fb51a2", "sha256": "16970e1441e882977f0b6d2bb75e8550d04eb4e673fc4bcf73f0306d7d83e8fa" }, "downloads": -1, "filename": "params_proto-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "91dff481d2450ffa129dc89162fb51a2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8479, "upload_time": "2017-09-11T03:55:34", "url": "https://files.pythonhosted.org/packages/fa/3c/0a605f4300d1eb8a9bc87b24582deb0d1a5f3c26c6983e51722899158850/params_proto-1.2.0-py3-none-any.whl" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "f473cc26769162c146017a5816459f4e", "sha256": "5233b9e6da1497d756cd3d008fdbf84f4a1899cb0add4c5fbf84e73b5f29f586" }, "downloads": -1, "filename": "params_proto-1.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "f473cc26769162c146017a5816459f4e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8499, "upload_time": "2017-09-11T04:02:28", "url": "https://files.pythonhosted.org/packages/32/a8/70f5aa6f70e3fc3e2270feda3bf4e2124166ba16a702133233e3280c7821/params_proto-1.3.0-py3-none-any.whl" } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "0dd080c1f29ddc618ea5462c1b55d9fc", "sha256": "1961ff68190051a1abc5b39498cae6b9fdb8370243f07c5ddf6f2b690413f4e7" }, "downloads": -1, "filename": "params_proto-2.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "0dd080c1f29ddc618ea5462c1b55d9fc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8188, "upload_time": "2018-01-13T09:01:08", "url": "https://files.pythonhosted.org/packages/ac/ea/914dccccc800702dbdde426e660c437ef14f9ee9a57eabb90a06005201cc/params_proto-2.0.0-py3-none-any.whl" } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "28e5ac0030fc923147476b95d234af15", "sha256": "59d1d982f448a4906cfe2f0848b789883142e96442604739ebed5de83a376636" }, "downloads": -1, "filename": "params_proto-2.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "28e5ac0030fc923147476b95d234af15", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8185, "upload_time": "2018-01-13T09:05:27", "url": "https://files.pythonhosted.org/packages/a6/ee/f1bdc86ebe8d7a3d59e9fe0d8e857360d3a71ee68ae0d115df2921da7470/params_proto-2.0.1-py3-none-any.whl" } ], "2.0.2": [ { "comment_text": "", "digests": { "md5": "37f19c4949b3b9f313d2747ad0d35ae9", "sha256": "46bdde0da9ca88d1995d28fbd7668e2d8d4f1d4b43ff45d4b85f935f093a4d48" }, "downloads": -1, "filename": "params_proto-2.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "37f19c4949b3b9f313d2747ad0d35ae9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8468, "upload_time": "2018-01-14T06:23:11", "url": "https://files.pythonhosted.org/packages/b9/69/09e7d3614927fe1c9eeafdd3658677c081575af54e1b7b38037cce8d75d9/params_proto-2.0.2-py3-none-any.whl" } ], "2.0.3": [ { "comment_text": "", "digests": { "md5": "992f34cfbde5251578a602f4f068d3e8", "sha256": "5709af1d3340b680a5cba56feb39df0a7381ddd8c77b43e875aea1e1282be921" }, "downloads": -1, "filename": "params_proto-2.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "992f34cfbde5251578a602f4f068d3e8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8498, "upload_time": "2018-01-14T06:32:06", "url": "https://files.pythonhosted.org/packages/75/33/7fbae0f432a73330e4ee16305c2dbc58d71f1d6f85929dafddad8bd34cff/params_proto-2.0.3-py3-none-any.whl" } ], "2.1.0": [ { "comment_text": "", "digests": { "md5": "241d22691ce7992f775cc4d93ce3c62e", "sha256": "60c8ca60a6dea35d198fd297dbaf492a9af9194d9e245800b70d40ef26e36306" }, "downloads": -1, "filename": "params_proto-2.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "241d22691ce7992f775cc4d93ce3c62e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8543, "upload_time": "2018-01-14T18:23:39", "url": "https://files.pythonhosted.org/packages/e8/11/527b1ea7f48f129e0813f3c785d238b7b98bc4b92f688a2a2ab1d08dd954/params_proto-2.1.0-py3-none-any.whl" } ], "2.2.0": [ { "comment_text": "", "digests": { "md5": "124a1e6bc7971f0fcb843c02ea08ded1", "sha256": "0dcc53beb444d4a69fb3ae5234c9665df99c0640d41afbb6d3f3c274ea15131e" }, "downloads": -1, "filename": "params_proto-2.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "124a1e6bc7971f0fcb843c02ea08ded1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8758, "upload_time": "2018-01-14T20:28:23", "url": "https://files.pythonhosted.org/packages/af/39/8414cc302ed55997aecb7bbcd91754aca8247e83b52f12fd939056df9f07/params_proto-2.2.0-py3-none-any.whl" } ], "2.2.1": [ { "comment_text": "", "digests": { "md5": "893d0a4d801b4d0bc2669a4c2492646d", "sha256": "f7050643cde4a11e0ca98181c3548662bf87e88b11c905e51e544b389cf518c5" }, "downloads": -1, "filename": "params_proto-2.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "893d0a4d801b4d0bc2669a4c2492646d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8745, "upload_time": "2018-01-14T21:27:17", "url": "https://files.pythonhosted.org/packages/f5/9e/7800dc4a06ac7fcf77b44d2f98cc046b525198f4f535f56c57c33cea46b1/params_proto-2.2.1-py3-none-any.whl" } ], "2.3.0": [ { "comment_text": "", "digests": { "md5": "d414c5f7a59e26b4e5871e269220b00f", "sha256": "3b487213800221815eb1bd3efcbe4e0ded6bb64627c56f26581e427d6468e4df" }, "downloads": -1, "filename": "params_proto-2.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d414c5f7a59e26b4e5871e269220b00f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6594, "upload_time": "2018-04-20T18:14:59", "url": "https://files.pythonhosted.org/packages/12/ae/8f8a93f26ef82260dd44d7b102e249b7f7e84af4ceb06255026a40ff8ba8/params_proto-2.3.0-py3-none-any.whl" } ], "2.4.0": [ { "comment_text": "", "digests": { "md5": "6810fb63a4ab7d892ea50075a513e0c5", "sha256": "f2902ecaa178d66f17b7053d585437250dc72f4e5f66b1360891c56832ea850e" }, "downloads": -1, "filename": "params_proto-2.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "6810fb63a4ab7d892ea50075a513e0c5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8304, "upload_time": "2019-06-12T01:43:33", "url": "https://files.pythonhosted.org/packages/3e/dc/117bbd05b2b480cb8e04a0a5e266ce50618dce680ec34e297453b45ec477/params_proto-2.4.0-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "6810fb63a4ab7d892ea50075a513e0c5", "sha256": "f2902ecaa178d66f17b7053d585437250dc72f4e5f66b1360891c56832ea850e" }, "downloads": -1, "filename": "params_proto-2.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "6810fb63a4ab7d892ea50075a513e0c5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8304, "upload_time": "2019-06-12T01:43:33", "url": "https://files.pythonhosted.org/packages/3e/dc/117bbd05b2b480cb8e04a0a5e266ce50618dce680ec34e297453b45ec477/params_proto-2.4.0-py3-none-any.whl" } ] }