¿Por qué no usar nombres de atributos como claves para un diccionario?
class StructMyDict(dict):
def __getattr__(self, name):
try:
return self[name]
except KeyError as e:
raise AttributeError(e)
def __setattr__(self, name, value):
self[name] = value
Puede inicializar con argumentos con nombre, una lista de tuplas o un diccionario, o asignaciones de atributos individuales, por ejemplo:
nautical = StructMyDict(left = "Port", right = "Starboard") # named args
nautical2 = StructMyDict({"left":"Port","right":"Starboard"}) # dictionary
nautical3 = StructMyDict([("left","Port"),("right","Starboard")]) # tuples list
nautical4 = StructMyDict() # fields TBD
nautical4.left = "Port"
nautical4.right = "Starboard"
for x in [nautical, nautical2, nautical3, nautical4]:
print "%s <--> %s" % (x.left,x.right)
Alternativamente, en lugar de generar el error de atributo, puede devolver Ninguno para valores desconocidos. (Un truco utilizado en la clase de almacenamiento web2py)
def __init__(self,**initial_data)
, obtiene el beneficio adicional de tener un método de inicio que también puede utilizar argumentos de palabras clave (por ejemplo, "e = Empleado (nombre = 'Oscar')" o simplemente tomar un diccionario (por ejemplo, "e = Empleado ( ** dict) ").