{ "info": { "author": "Brendan Curran-Johnson", "author_email": "brendan@bcjbcj.ca", "bugtrack_url": null, "classifiers": [ "Development Status :: 7 - Inactive", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy" ], "description": "========\nAttrDict\n========\n.. image:: https://travis-ci.org/bcj/AttrDict.svg?branch=master\n :target: https://travis-ci.org/bcj/AttrDict?branch=master\n.. image:: https://coveralls.io/repos/bcj/AttrDict/badge.png?branch=master\n :target: https://coveralls.io/r/bcj/AttrDict?branch=master\n\nAttrDict is an MIT-licensed library that provides mapping objects that allow\ntheir elements to be accessed both as keys and as attributes::\n\n > from attrdict import AttrDict\n > a = AttrDict({'foo': 'bar'})\n > a.foo\n 'bar'\n > a['foo']\n 'bar'\n\nAttribute access makes it easy to create convenient, hierarchical settings\nobjects::\n\n with open('settings.yaml') as fileobj:\n settings = AttrDict(yaml.safe_load(fileobj))\n\n cursor = connect(**settings.db.credentials).cursor()\n\n cursor.execute(\"SELECT column FROM table;\")\n\nInstallation\n============\nAttrDict is in PyPI, so it can be installed directly using::\n\n $ pip install attrdict\n\nOr from Github::\n\n $ git clone https://github.com/bcj/AttrDict\n $ cd AttrDict\n $ python setup.py install\n\nBasic Usage\n===========\nAttrDict comes with three different classes, `AttrMap`, `AttrDict`, and\n`AttrDefault`. They are all fairly similar, as they all are MutableMappings (\nread: dictionaries) that allow creating, accessing, and deleting key-value\npairs as attributes.\n\nValid Names\n-----------\nAny key can be used as an attribute as long as:\n\n#. The key represents a valid attribute (i.e., it is a string comprised only of\n alphanumeric characters and underscores that doesn't start with a number)\n#. The key represents a public attribute (i.e., it doesn't start with an\n underscore). This is done (in part) so that implementation changes between\n minor and micro versions don't force major version changes.\n#. The key does not shadow a class attribute (e.g., get).\n\nAttributes vs. Keys\n-------------------\nThere is a minor difference between accessing a value as an attribute vs.\naccessing it as a key, is that when a dict is accessed as an attribute, it will\nautomatically be converted to an Attr object. This allows you to recursively\naccess keys::\n\n > attr = AttrDict({'foo': {'bar': 'baz'}})\n > attr.foo.bar\n 'baz'\n\nRelatedly, by default, sequence types that aren't `bytes`, `str`, or `unicode`\n(e.g., lists, tuples) will automatically be converted to tuples, with any\nmappings converted to Attrs::\n\n > attr = AttrDict({'foo': [{'bar': 'baz'}, {'bar': 'qux'}]})\n > for sub_attr in attr.foo:\n > print(sub_attr.foo)\n 'baz'\n 'qux'\n\nTo get this recursive functionality for keys that cannot be used as attributes,\nyou can replicate the behavior by calling the Attr object::\n\n > attr = AttrDict({1: {'two': 3}})\n > attr(1).two\n 3\n\nClasses\n-------\nAttrDict comes with three different objects, `AttrMap`, `AttrDict`, and\n`AttrDefault`.\n\nAttrMap\n^^^^^^^\nThe most basic implementation. Use this if you want to limit the number of\ninvalid keys, or otherwise cannot use `AttrDict`\n\nAttrDict\n^^^^^^^^\nAn Attr object that subclasses `dict`. You should be able to use this\nabsolutely anywhere you can use a `dict`. While this is probably the class you\nwant to use, there are a few caveats that follow from this being a `dict` under\nthe hood.\n\nThe `copy` method (which returns a shallow copy of the mapping) returns a\n`dict` instead of an `AttrDict`.\n\nRecursive attribute access results in a shallow copy, so recursive assignment\nwill fail (as you will be writing to a copy of that dictionary)::\n\n > attr = AttrDict('foo': {})\n > attr.foo.bar = 'baz'\n > attr.foo\n {}\n\nAssignment as keys will still work::\n\n > attr = AttrDict('foo': {})\n > attr['foo']['bar'] = 'baz'\n > attr.foo\n {'bar': 'baz'}\n\nIf either of these caveats are deal-breakers, or you don't need your object to\nbe a `dict`, consider using `AttrMap` instead.\n\nAttrDefault\n^^^^^^^^^^^\nAt Attr object that behaves like a `defaultdict`. This allows on-the-fly,\nautomatic key creation::\n\n > attr = AttrDefault(int, {})\n > attr.foo += 1\n > attr.foo\n 1\n\nAttrDefault also has a `pass_key` option that passes the supplied key to the\n`default_factory`::\n\n > attr = AttrDefault(sorted, {}, pass_key=True)\n > attr.banana\n ['a', 'a', 'a', 'b', 'n', 'n']\n\nMerging\n-------\nAll three Attr classes can be merged with eachother or other Mappings using the\n``+`` operator. For conflicting keys, the right dict's value will be\npreferred, but in the case of two dictionary values, they will be\nrecursively merged::\n\n > a = {'foo': 'bar', 'alpha': {'beta': 'a', 'a': 'a'}}\n > b = {'lorem': 'ipsum', 'alpha': {'bravo': 'b', 'a': 'b'}}\n > AttrDict(a) + b\n {'foo': 'bar', 'lorem': 'ipsum', 'alpha': {'beta': 'a', 'bravo': 'b', 'a': 'b'}}\n\nNOTE: AttrDict's add is not commutative, ``a + b != b + a``::\n\n > a = {'foo': 'bar', 'alpha': {'beta': 'b', 'a': 0}}\n > b = {'lorem': 'ipsum', 'alpha': {'bravo': 'b', 'a': 1}}\n > b + AttrDict(a)\n {'foo': 'bar', 'lorem': 'ipsum', 'alpha': {'beta': 'a', 'bravo': 'b', 'a': }}\n\nSequences\n---------\nBy default, items in non-string Sequences (e.g. lists, tuples) will be\nconverted to AttrDicts::\n\n > adict = AttrDict({'list': [{'value': 1}, {'value': 2}]})\n > for element in adict.list:\n > element.value\n 1\n 2\n\nThis will not occur if you access the AttrDict as a dictionary::\n\n > adict = AttrDict({'list': [{'value': 1}, {'value': 2}]})\n > for element in adict['list']:\n > isinstance(element, AttrDict)\n False\n False\n\nTo disable this behavior globally, pass the attribute ``recursive=False`` to\nthe constructor::\n\n > adict = AttrDict({'list': [{'value': 1}, {'value': 2}]}, recursive=False)\n > for element in adict.list:\n > isinstance(element, AttrDict)\n False\n False\n\nWhen merging an AttrDict with another mapping, this behavior will be disabled\nif at least one of the merged items is an AttrDict that has set ``recursive``\nto ``False``.\n\nLicense\n=======\nAttrDict is released under a MIT license.\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/bcj/AttrDict", "keywords": "", "license": "MIT License", "maintainer": "", "maintainer_email": "", "name": "attrdict", "package_url": "https://pypi.org/project/attrdict/", "platform": "", "project_url": "https://pypi.org/project/attrdict/", "project_urls": { "Homepage": "https://github.com/bcj/AttrDict" }, "release_url": "https://pypi.org/project/attrdict/2.0.1/", "requires_dist": [ "six" ], "requires_python": "", "summary": "A dict with attribute-style access", "version": "2.0.1" }, "last_serial": 4770686, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "337d07a2643b7bf6c7a243a12ddc7e4a", "sha256": "66626d6fb6f955f866cfabec907e0e40a4a5237b07328a3318e6d96a566001d9" }, "downloads": -1, "filename": "attrdict-0.1.0.tar.gz", "has_sig": false, "md5_digest": "337d07a2643b7bf6c7a243a12ddc7e4a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5429, "upload_time": "2013-11-23T04:58:01", "url": "https://files.pythonhosted.org/packages/da/a4/8c20c88b3df174e844803a4d4239a573d02b78e9e49421733f3bc8be8ce9/attrdict-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "0bb02a8d1b74e5a5e0a36a1b7aa6c5a2", "sha256": "a92a19cf30fbc94e1411a7d2c180c1f9052b68b04653c07075ea04b333992427" }, "downloads": -1, "filename": "attrdict-0.1.1.tar.gz", "has_sig": false, "md5_digest": "0bb02a8d1b74e5a5e0a36a1b7aa6c5a2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6900, "upload_time": "2013-11-23T05:08:36", "url": "https://files.pythonhosted.org/packages/c9/2b/1741b5b85d988e3467ed7009ea5930acbb7774cf5725a3f7a1b9e7137a51/attrdict-0.1.1.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "3f4d5468be8025a02c67b06ecdb04f64", "sha256": "e733b4cd1da5c880031656b6cdfcc86240916898ada6ac07e6a89800e9f30b35" }, "downloads": -1, "filename": "attrdict-0.2.0.tar.gz", "has_sig": false, "md5_digest": "3f4d5468be8025a02c67b06ecdb04f64", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7694, "upload_time": "2014-01-03T19:20:31", "url": "https://files.pythonhosted.org/packages/28/fa/061db9426a8a53c831104b55b488aaf85f403b5ebbc13ba5931ed6678f3c/attrdict-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "3a6772cc396904de0f8736188608b7d0", "sha256": "7f94b34810632715275eae75bce93bfb8714f9a825d3db852fc5862114c11e0b" }, "downloads": -1, "filename": "attrdict-0.2.1.tar.gz", "has_sig": false, "md5_digest": "3a6772cc396904de0f8736188608b7d0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8408, "upload_time": "2014-03-19T16:36:29", "url": "https://files.pythonhosted.org/packages/c7/e8/054abbc9a741ecf21ee68cf307932173a76eb390fb9334c25b70553eb1cb/attrdict-0.2.1.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "537ec2bb24c2c1df8e7f8be37e14a0ff", "sha256": "532f5a03cc1aa94b16d9fd9dfcc6d919b3557a84f2f5198e774491e84a84ebfc" }, "downloads": -1, "filename": "attrdict-0.3.0.macosx-10.9-x86_64.exe", "has_sig": false, "md5_digest": "537ec2bb24c2c1df8e7f8be37e14a0ff", "packagetype": "bdist_wininst", "python_version": "any", "requires_python": null, "size": 75010, "upload_time": "2014-05-28T21:30:00", "url": "https://files.pythonhosted.org/packages/72/6b/3818390a017d757d3542b0a59911fa207160778d323a14ae771858bf6ee2/attrdict-0.3.0.macosx-10.9-x86_64.exe" }, { "comment_text": "", "digests": { "md5": "f62c724b2d869eb04d49972a48e569f3", "sha256": "f3e09d0132e7aa9e4a9751abfd8cf2332a5112bafef7efbe41f39bbe543128fd" }, "downloads": -1, "filename": "attrdict-0.3.0.tar.gz", "has_sig": false, "md5_digest": "f62c724b2d869eb04d49972a48e569f3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6182, "upload_time": "2014-05-28T21:29:56", "url": "https://files.pythonhosted.org/packages/73/15/d57dc3860de68f7d772be25f7155f50302e5998dcf1a63bab396e9f0f161/attrdict-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "51d6b128fed95f82e8917956fa980472", "sha256": "d2e1ac66c8bb623076952b47f23a56154060779887cffa79bc15ca8887d22590" }, "downloads": -1, "filename": "attrdict-0.3.1.macosx-10.9-x86_64.exe", "has_sig": false, "md5_digest": "51d6b128fed95f82e8917956fa980472", "packagetype": "bdist_wininst", "python_version": "any", "requires_python": null, "size": 75006, "upload_time": "2014-06-03T16:42:48", "url": "https://files.pythonhosted.org/packages/fd/69/7e4181dc5cfd717437643e0ab687ae177245cd75b1ed10fc5dc7d273e75e/attrdict-0.3.1.macosx-10.9-x86_64.exe" }, { "comment_text": "", "digests": { "md5": "3ad410bf733530c4e9489d7e95043811", "sha256": "23f347449fcd52b3edfa908d51bec9874f3691b0227960eb8dc0b9758479567e" }, "downloads": -1, "filename": "attrdict-0.3.1.tar.gz", "has_sig": false, "md5_digest": "3ad410bf733530c4e9489d7e95043811", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6191, "upload_time": "2014-06-03T16:42:45", "url": "https://files.pythonhosted.org/packages/da/a9/811b1ad8629b61d21d5403d24e357d8c7d2b23f335fa3ab762a8f4199b7e/attrdict-0.3.1.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "42e138470ca594a1fc09e5cb517a8f2f", "sha256": "bd75e0896ec3575ac0d1182fdf28d8d63119ad287078d5a3ff4507ec25b050a7" }, "downloads": -1, "filename": "attrdict-0.4.0.macosx-10.9-x86_64.exe", "has_sig": false, "md5_digest": "42e138470ca594a1fc09e5cb517a8f2f", "packagetype": "bdist_wininst", "python_version": "any", "requires_python": null, "size": 73611, "upload_time": "2014-07-01T06:48:56", "url": "https://files.pythonhosted.org/packages/46/56/d18dc4aebd75424b4a77dada4d0478c04cabc3380da49c74d994e4ab691e/attrdict-0.4.0.macosx-10.9-x86_64.exe" }, { "comment_text": "", "digests": { "md5": "2340cd9559ab45b247e38e8d31e10d6c", "sha256": "884445f6d96057377c78d1deff4f922fea94205cfbb1d535fa7e31091b643be1" }, "downloads": -1, "filename": "attrdict-0.4.0.tar.gz", "has_sig": false, "md5_digest": "2340cd9559ab45b247e38e8d31e10d6c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6927, "upload_time": "2014-07-01T06:48:54", "url": "https://files.pythonhosted.org/packages/72/af/7695eb22454407541bd4818b81f6319b3c6ba33ba301a8be28cdcc79d0e8/attrdict-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "cd659c9e1f85ddde4956be8ef9b90d30", "sha256": "5ef6a1cc779bfd12d0a3dca02ddbd04bce378113c73efa3a5dcd92af6c110405" }, "downloads": -1, "filename": "attrdict-0.5.0.macosx-10.9-x86_64.exe", "has_sig": false, "md5_digest": "cd659c9e1f85ddde4956be8ef9b90d30", "packagetype": "bdist_wininst", "python_version": "any", "requires_python": null, "size": 73768, "upload_time": "2014-07-14T15:35:37", "url": "https://files.pythonhosted.org/packages/1f/f6/a519c19112db6c33a010dfdcfd484e4bd686201d6c00f9a4628aa4a80c35/attrdict-0.5.0.macosx-10.9-x86_64.exe" }, { "comment_text": "", "digests": { "md5": "6f629791f3f10072b1069963437b24e1", "sha256": "59eb329ff9ab1ff5cbfa7a100fc8430a442deba34201ea2988f2e5e008fb7e3f" }, "downloads": -1, "filename": "attrdict-0.5.0.tar.gz", "has_sig": false, "md5_digest": "6f629791f3f10072b1069963437b24e1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7147, "upload_time": "2014-07-14T15:35:34", "url": "https://files.pythonhosted.org/packages/09/ae/83322f4c9624871acc9fbe5caa548b0d5e4d27c68a9a5e3b7c0b5f5a695c/attrdict-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "f9f5cb37186aa2395a62eb19dea5afe5", "sha256": "d620f43de0cb15c8f1d8ec8f5f3ea8be02979d897ed330d6a3055aafde6be77d" }, "downloads": -1, "filename": "attrdict-0.5.1.macosx-10.9-x86_64.exe", "has_sig": false, "md5_digest": "f9f5cb37186aa2395a62eb19dea5afe5", "packagetype": "bdist_wininst", "python_version": "any", "requires_python": null, "size": 73772, "upload_time": "2014-07-14T19:16:18", "url": "https://files.pythonhosted.org/packages/64/f7/20ba7b8956ac126fff8783e8e297fe3b4981c46479b578a4c94e63cf5e22/attrdict-0.5.1.macosx-10.9-x86_64.exe" }, { "comment_text": "", "digests": { "md5": "55f300b3741da5b9ac57d9b553660c5d", "sha256": "0c9058c091dabd8ddf43fb07b918c88d8bda787420a29cc40a364ecf2f3bec6a" }, "downloads": -1, "filename": "attrdict-0.5.1.tar.gz", "has_sig": false, "md5_digest": "55f300b3741da5b9ac57d9b553660c5d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7197, "upload_time": "2014-07-14T19:16:13", "url": "https://files.pythonhosted.org/packages/74/e4/92f8ff22cabac91a97bf1109b176ade03009e4699cb3844df0e0396f7e7b/attrdict-0.5.1.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "b8915c92fdb98901dc25b95630bbdbdc", "sha256": "fff557cc9be21d6bef90acbaa64824c72ca5bd13fa601e4c9a6539d868ac6a27" }, "downloads": -1, "filename": "attrdict-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b8915c92fdb98901dc25b95630bbdbdc", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 9606, "upload_time": "2014-08-18T14:33:12", "url": "https://files.pythonhosted.org/packages/78/9c/091d64868a3edf9c9f9cf90440c3b0d556a500a607abc5cb36e1c6edc25f/attrdict-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d6ec4c2d7991bd45230ef0c6c043f25e", "sha256": "bfab15a8b9f3935e871823899108108bf84c5d6adfb316e13cfd09b832aa49cf" }, "downloads": -1, "filename": "attrdict-1.0.0.tar.gz", "has_sig": false, "md5_digest": "d6ec4c2d7991bd45230ef0c6c043f25e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7892, "upload_time": "2014-08-18T14:33:09", "url": "https://files.pythonhosted.org/packages/b8/1c/e4609b8dd80ad496cf8f21a13d8c8b81c360bf0523daf8fd74092957e3b9/attrdict-1.0.0.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "d48efb3f5d2bce988d4cabe8fce2236f", "sha256": "527eaea626b8603610d70853b61aabfc9a9918ea6edbcf3ce2760a27380d1606" }, "downloads": -1, "filename": "attrdict-1.1.0.tar.gz", "has_sig": false, "md5_digest": "d48efb3f5d2bce988d4cabe8fce2236f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7996, "upload_time": "2014-10-29T21:42:07", "url": "https://files.pythonhosted.org/packages/fa/53/6db70b37b4619892d165b7ef248191f21caa0a717410b0d6887006c7fcac/attrdict-1.1.0.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "f1f6be2748d35be033f726d52762995d", "sha256": "f17c3dc502c561ed8b58b1511b762851a3ecff07eda16ad6d704014594baadff" }, "downloads": -1, "filename": "attrdict-1.2.0.tar.gz", "has_sig": false, "md5_digest": "f1f6be2748d35be033f726d52762995d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8063, "upload_time": "2014-11-27T06:57:34", "url": "https://files.pythonhosted.org/packages/98/3d/1f4ab98de4e1413c3b641f70c4235d7e648808d717e2e49fb209ee075894/attrdict-1.2.0.tar.gz" } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "8a7c1a4e737fe9e2b2b8844c0f7746f8", "sha256": "86aeb6d3809e0344409f8148d7cac9eabce5f0b577c160b5e90d10df3f8d2ad3" }, "downloads": -1, "filename": "attrdict-2.0.0.tar.gz", "has_sig": false, "md5_digest": "8a7c1a4e737fe9e2b2b8844c0f7746f8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8994, "upload_time": "2015-04-10T00:28:22", "url": "https://files.pythonhosted.org/packages/35/bb/bac3e42ae04bc082c28cd8186bfb5b50fb240a4f7419f876c683125ccc8b/attrdict-2.0.0.tar.gz" } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "b10e44e149116ba79ab6c04ec9c892e7", "sha256": "9432e3498c74ff7e1b20b3d93b45d766b71cbffa90923496f82c4ae38b92be34" }, "downloads": -1, "filename": "attrdict-2.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b10e44e149116ba79ab6c04ec9c892e7", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9946, "upload_time": "2019-02-01T22:33:56", "url": "https://files.pythonhosted.org/packages/ef/97/28fe7e68bc7adfce67d4339756e85e9fcf3c6fd7f0c0781695352b70472c/attrdict-2.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6d541c82592568dc0dfcecf57978b326", "sha256": "35c90698b55c683946091177177a9e9c0713a0860f0e049febd72649ccd77b70" }, "downloads": -1, "filename": "attrdict-2.0.1.tar.gz", "has_sig": false, "md5_digest": "6d541c82592568dc0dfcecf57978b326", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9593, "upload_time": "2019-02-01T22:33:58", "url": "https://files.pythonhosted.org/packages/3f/72/614aae677d28e81a5bf830fadcf580803876ef76e0306902d3ca5790cd9a/attrdict-2.0.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "b10e44e149116ba79ab6c04ec9c892e7", "sha256": "9432e3498c74ff7e1b20b3d93b45d766b71cbffa90923496f82c4ae38b92be34" }, "downloads": -1, "filename": "attrdict-2.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b10e44e149116ba79ab6c04ec9c892e7", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9946, "upload_time": "2019-02-01T22:33:56", "url": "https://files.pythonhosted.org/packages/ef/97/28fe7e68bc7adfce67d4339756e85e9fcf3c6fd7f0c0781695352b70472c/attrdict-2.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6d541c82592568dc0dfcecf57978b326", "sha256": "35c90698b55c683946091177177a9e9c0713a0860f0e049febd72649ccd77b70" }, "downloads": -1, "filename": "attrdict-2.0.1.tar.gz", "has_sig": false, "md5_digest": "6d541c82592568dc0dfcecf57978b326", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9593, "upload_time": "2019-02-01T22:33:58", "url": "https://files.pythonhosted.org/packages/3f/72/614aae677d28e81a5bf830fadcf580803876ef76e0306902d3ca5790cd9a/attrdict-2.0.1.tar.gz" } ] }