Tengo métodos que aceptan dicts u otros objetos y los nombres de "campos" para obtener de esos objetos. Si el objeto es un dict, el método usa __getitem__
para recuperar la clave con nombre, o bien usa getattr
para recuperar el atributo nombrado. Esto es bastante común en lenguajes de plantillas web. Por ejemplo, en una plantilla Chameleon es posible que tenga:¿Por qué Python no tiene un getattr híbrido + __getitem__ incorporado?
<p tal:content="foo.keyname">Stuff goes here</p>
Si pasa en foo
como dict como {'keyname':'bar'}
, entonces foo.keyname
Obtiene la tecla 'nombre de clave' para obtener 'bar'. Si foo
es una instancia de una clase como:
class Foo(object):
keyname = 'baz'
continuación foo.keyname
recoge el valor del atributo keyname
. sí camaleón implementa esa función (en el módulo chameleon.py26
) así:
def lookup_attr(obj, key):
try:
return getattr(obj, key)
except AttributeError as exc:
try:
get = obj.__getitem__
except AttributeError:
raise exc
try:
return get(key)
except KeyError:
raise exc
vez implementado en my own package como:
try:
value = obj[attribute]
except (KeyError, TypeError):
value = getattr(obj, attribute)
Lo que pasa es que es un patrón bastante común. He visto ese método o uno muy similar en muchos módulos. Entonces, ¿por qué no es algo así en el núcleo del lenguaje, o al menos en uno de los módulos centrales? En su defecto, ¿hay una forma definitiva de cómo se podría escribir ?
Me opongo enérgicamente a que "El problema es que ese es un patrón bastante común". Explícito es mejor que explícito. El acceso de atributo es algo completamente accesible por clave ... –
Sí, pero todavía es bastante común en ciertos contextos, como los lenguajes de plantilla de página. Lo he visto (y necesito implementarlo) con la frecuencia suficiente como para desear que se haya refabricado en el núcleo o en un módulo común. –
No hay nada como eso, probablemente porque el desarrollador de Python no quiere imponer un mal estilo de programación ... punto ... si escribe código incorrecto, entonces tiene que escribirlo explícitamente ... explícito es mejor que implícito . –