Cómo utilizar un punto "." para acceder a los miembros del diccionario?
¿Cómo puedo hacer que los miembros del diccionario de Python sean accesibles mediante un punto "."?
Por ejemplo, en lugar de escribir mydict['val']
, me gustaría escribir mydict.val
.
También me gustaría acceder a dictados anidados de esta manera. Por ejemplo
mydict.mydict2.val
se referiría a
mydict = { 'mydict2': { 'val': ... } }
Aceptado
Siempre he guardado esto en un archivo de utilidad. También puedes usarlo como mixin en tus propias clases.
class dotdict(dict):
"""dot.notation access to dictionary attributes"""
__getattr__ = dict.get
__setattr__ = dict.__setitem__
__delattr__ = dict.__delitem__
mydict = {'val':'it works'}
nested_dict = {'val':'nested works too'}
mydict = dotdict(mydict)
mydict.val
# 'it works'
mydict.nested = dotdict(nested_dict)
mydict.nested.val
# 'nested works too'
Puedes hacerlo usando esta clase que acabo de crear. Con esta clase puedes usar el Map
objeto como otro diccionario (incluida la serialización json) o con la notación de puntos. Espero ayudarte:
class Map(dict):
"""
Example:
m = Map({'first_name': 'Eduardo'}, last_name='Pool', age=24, sports=['Soccer'])
"""
def __init__(self, *args, **kwargs):
super(Map, self).__init__(*args, **kwargs)
for arg in args:
if isinstance(arg, dict):
for k, v in arg.iteritems():
self[k] = v
if kwargs:
for k, v in kwargs.iteritems():
self[k] = v
def __getattr__(self, attr):
return self.get(attr)
def __setattr__(self, key, value):
self.__setitem__(key, value)
def __setitem__(self, key, value):
super(Map, self).__setitem__(key, value)
self.__dict__.update({key: value})
def __delattr__(self, item):
self.__delitem__(item)
def __delitem__(self, key):
super(Map, self).__delitem__(key)
del self.__dict__[key]
Ejemplos de uso:
m = Map({'first_name': 'Eduardo'}, last_name='Pool', age=24, sports=['Soccer'])
# Add new key
m.new_key = 'Hello world!'
# Or
m['new_key'] = 'Hello world!'
print m.new_key
print m['new_key']
# Update values
m.new_key = 'Yay!'
# Or
m['new_key'] = 'Yay!'
# Delete key
del m.new_key
# Or
del m['new_key']