pip3 install dotmap
Get updates for current installation
pip3 install --upgrade dotmap
DotMap is a dot-access dict subclass that
- has dynamic hierarchy creation (autovivification)
- can be initialized with keys
- easily initializes from
dict - easily converts to
dict - is ordered by insertion
The key feature is exactly what you want: dot-access
from dotmap import DotMap
m = DotMap()
m.name = 'Joe'
print('Hello ' + m.name)
# Hello JoeHowever, DotMap is a dict and you can treat it like a dict as needed
print(m['name'])
# Joe
m.name += ' Smith'
m['name'] += ' Jr'
print(m.name)
# Joe Smith JrIt also has fast, automatic hierarchy (which can be deactivated by initializing with DotMap(_dynamic=False) or by using StaticDotMap)
m = DotMap()
m.people.steve.age = 31You can provide a factory for default values of missing keys when you do not want automatic hierarchy creation for absent keys. Like collections.defaultdict, the factory is called on each miss and the result is stored under the key
m = DotMap({'city': 'abc', 'CountryCode': 101}, _default_factory=str)
print(m.zipCode)
# ''And key initialization
m = DotMap(a=1, b=2)You can initialize it from dict and convert it to dict
d = {'a':1, 'b':2}
m = DotMap(d)
print(m)
# DotMap(a=1, b=2)
print(m.toDict())
# {'a': 1, 'b': 2}And it has iteration that is ordered by insertion
m = DotMap()
m.people.john.age = 32
m.people.john.job = 'programmer'
m.people.mary.age = 24
m.people.mary.job = 'designer'
m.people.dave.age = 55
m.people.dave.job = 'manager'
for k, v in m.people.items():
print(k, v)
print
# john DotMap(age=32, job='programmer')
# mary DotMap(age=24, job='designer')
# dave DotMap(age=55, job='manager')It also has automatic counter initialization
m = DotMap()
for i in range(7):
m.counter += 1
print(m.counter)
# 7And automatic addition initializations of any other type
m = DotMap()
m.quote += 'lions'
m.quote += ' and tigers'
m.quote += ' and bears'
m.quote += ', oh my'
print(m.quote)
# lions and tigers and bears, oh myThere is also built-in pprint as dict or json for debugging a large DotMap
m.pprint()
# {'people': {'dave': {'age': 55, 'job': 'manager'},
# 'john': {'age': 32, 'job': 'programmer'},
# 'mary': {'age': 24, 'job': 'designer'}}}
m.pprint(pformat='json')
# {
# "people": {
# "dave": {
# "age": 55,
# "job": "manager"
# },
# "john": {
# "age": 32,
# "job": "programmer"
# },
# "mary": {
# "age": 24,
# "job": "designer"
# }
# }
# }And many other features involving dots and dictionaries that will be immediately intuitive when used.