skip to navigation
skip to content

mydict 1.0.14

A Python dict subclass which tries to act like JavaScript objects, so you can use the dot-notation ( to access members of the object.

A Python dict subclass which tries to act like JavaScript objects, so you can use the dot notation ( to access members of the object. If the member doesn’t exist yet then it’s created when you assign a value to it. Brackets notation (d[‘foo’]) is also possible.


$ pip install mydict


Let’s give it a try

d = MyDict() = 'bar'

# ==> 'bar'

If you try to get the value of a non-existing member then a None value is returned

d = MyDict()
if is None:
    print('"foo" does not exist yet!')

If that value is “complex” (a dict or another MyDict instance), then it’s also recursively transformed into a MyDict object, so you can access it in the same way

d = MyDict() = {'bar': 'baz', 'lst': [{'a': 123}]}

# ==> 'baz'

# ==> 'baz'

# ==> 123

Values in lists are accessed, as you expect, with the brackets notation (d[0]):

d = MyDict() = [1, 2, 3]

# ==> 3

We can instantiate it from a dict of any level of complexity

d = MyDict({'foo': 'bar', 'baz': [1, 2, {'foo': 'bar', 'baz': 'Hello, world!'}}])

# ==> 'bar'

# ==> 1

# ==> 'bar'

with keywords in the constructor

d = MyDict(a=1, b=2.2, c=[1, 2, 3], d=[{'x': 1, 'y': [100, 200, 300]}])
d.a == 1
d.b == 2.2
d.c[0] == 1
d.d[0].x == 1
d.d[0].y[1] == 200

or both

d = MyDict({'foo': 'bar'}, baz=123)
... == 'bar'
d.baz == 123

Please, take into account that keyword initialization has precedence over the dict (first parameter of the constructor)

d = MyDict({'foo': 'bar'}, foo='BAR')
... == 'BAR'

It’s also possible to access members using a path with get or brackets notation (d[‘…’]):

d = MyDict(foo={'bar': 'baz'})
d[''] == 'baz'
d.get('') == 'baz'

But when those keys with dots exists in the tree they are accessed using the corresponding key

d = MyDict({'': 'baz'})
# '' is not interpreted as a path because the key exists
d[''] = 'baz'

But there’s a particular case, if a dotted key exists and match an existing path, then this ain’t work properly, or work in a different way depending on the method of access used, to be correct

d = MyDict({'foo': {'bar': 'baz'}, '': 'BAZ'})
d[''] = 'BAZ'  # the "dotted field" ('') has precedence over the path = 'baz'  # it's not possible to detect a "dotted key" using "dot notation"

Personally, I don’t see this as a great issue because I generally avoid using dots in keys, like in the previous case

Initialization from JSON

It’s also possible to load a JSON from str, bytes, and file-like objects (with a .read() method) using the static method from_json:

d = MyDict.from_json('{"foo": "bar"}')
# == 'bar'

d = MyDict.from_json(b'{"foo": "bar"}')
# == 'bar'

d = MyDict.from_json(open('/path/to/file.json', 'r'))
# d = MyDict.from_json(open('/path/to/file.json', 'rb')) also work

from io import StringIO, BytesIO

s = StringIO()
s.write('{"foo": "bar"}')

d = MyDict.from_json(s)
# == 'bar'


b = StringIO()
b.write(b'{"foo": "bar"}')

d = MyDict.from_json(b)
# == 'bar'

The tests passed successfully with Python 3.6. With Python 2.7 failed on “bytes stuff” tests, regarding the use of the static method “from_json()”

$ pytest mydict -v
File Type Py Version Uploaded on Size
mydict-1.0.14-py2.py3-none-any.whl (md5) Python Wheel 3.6 2017-08-06 8KB
mydict-1.0.14.tar.gz (md5) Source 2017-08-06 5KB