he empezado a utilizar construcciones como éstas:notación de puntos de estilo Javascript para las teclas del diccionario unpythonic?
class DictObj(object):
def __init__(self):
self.d = {}
def __getattr__(self, m):
return self.d.get(m, None)
def __setattr__(self, m, v):
super.__setattr__(self, m, v)
Actualización: basado en este hilo, he revisó la aplicación DictObj a:
class dotdict(dict):
def __getattr__(self, attr):
return self.get(attr, None)
__setattr__= dict.__setitem__
__delattr__= dict.__delitem__
class AutoEnum(object):
def __init__(self):
self.counter = 0
self.d = {}
def __getattr__(self, c):
if c not in self.d:
self.d[c] = self.counter
self.counter += 1
return self.d[c]
donde DictObj es un diccionario que puede ser acceder a través de la notación de puntos:
d = DictObj()
d.something = 'one'
me resulta estéticamente más agradable que d['something']
. Tenga en cuenta que acceder a una clave indefinida devuelve None en lugar de generar una excepción, lo que también es agradable.
Actualización: Smashery hace un buen punto, que mhawke se expande para una solución más fácil. Me pregunto si hay efectos secundarios indeseables de usar dict en lugar de definir un nuevo diccionario; si no, me gusta mucho la solución de mhawke.
AutoEnum es una enumeración de incremento automático, que se utiliza como esto:
CMD = AutoEnum()
cmds = {
"peek": CMD.PEEK,
"look": CMD.PEEK,
"help": CMD.HELP,
"poke": CMD.POKE,
"modify": CMD.POKE,
}
Ambos están trabajando bien para mí, pero me siento unpythonic sobre ellos.
¿Son estas construcciones realmente malas?
¡Muy bonito! el dotdict de clase es mínimo y elegante. Creo que lo usaré Sin embargo, sobre el "AutoEnum" ... mi problema es que el "valor" para cada "clave" puede ser diferente en cada ejecución, por lo que no puede usarlo para valores almacenados en una base de datos o nada (bueno, Supongo que podría mantener los valores iguales, si tiene cuidado de no cambiar nunca el orden de acceso inicial ... pero los valores no son explícitos) –
¡Espera !, hay un problema con el puntoDiccionario: no funciona si lo intenta usar una clave que es el nombre de un método dict, como cualquiera de estos: "elementos", "claves", "obtener", "borrar", "copiar", etc. ... eso es un problema. ¿Hay alguna forma de evitar esto? ¿Hay alguna forma de "tener tu pastel y comértelo también"? (para poder llamar a los métodos dict, pero también para poder usar claves como "elementos" y "borrar" sin cambiar la sintaxis?). –