suptitle - Python y diccionario como objeto
subplot title python (6)
Bueno, para actualizar recursivamente un diccionario, debe llamar al método ''elementos'' para iterarlo.
Así que sugiero, simplemente hazlo:
try :
for key, value in data.items() :
# recursive call
except AttributeError :
# handling the trouble
Necesito una función de actualización profunda de Python 3.1 para los diccionarios (una función que actualizará recursivamente los diccionarios secundarios que están dentro de un diccionario principal).
Pero creo que, en el futuro, mi función podría tener que lidiar con objetos que se comportan como diccionarios pero no lo son. Y, además, quiero evitar el uso de isinstance
y type
(porque se consideran malos, ya que puedo leer en casi todos los blogs de Pythonista).
Pero la tipificación de pato es parte de la filosofía de Python, así que, ¿cómo puedo verificar si un objeto es como un diccionario?
¡Gracias!
Edit: Gracias a todos por las respuestas. Por si acaso, la función que codifiqué se puede encontrar en este lugar: http://blog.cafeaumiel.com/public/python/dict_deep_update.py
Consulte las clases base abstractas (nuevas en 3.x) (ABC) en el módulo de colecciones:
http://docs.python.org/3.1/library/collections.html
Consideraría verificar con isinstance contra Mapping como en lo siguiente:
>>> import collections
>>> isinstance({},collections.Mapping)
True
Luego, si creas tu propia clase de dictado, crea colecciones.Mapear una de sus bases.
La otra ruta es intentar y capturar las excepciones para las operaciones del diccionario, pero con la recursión de la que está hablando, prefiero verificar el tipo de base antes que manejar el cálculo de qué dict o subdict u otro miembro del dict fue o fue No hay para lanzar una excepción.
Edición para agregar: el beneficio de comparar con Mapping ABC en lugar de contra dict es que la misma prueba funcionará para las clases similares a dict, independientemente de si son subclases dict o no, por lo que es más flexible, por si acaso.
La escritura de pato es donde haces lo que quieres hacer, y lidias con las consecuencias si tus objetos no se comportan de la manera que esperabas.
Quieres verificar si algo es similar a un dict, y actualizarlo si es así, ¿verdad? Simplemente llame al método de actualización del objeto y maneje la excepción que obtendrá si no existe tal método.
Por supuesto, esto fracasará si trata con objetos de clase personalizados que tienen métodos de actualización que hacen algo completamente distinto. No estoy muy seguro de cómo lidiar con eso.
Me gusta verificar el método mágico '' __setitem__ '' ... esto es lo que permite el comportamiento foo [''bar''] = baz.
if getattr(obj, ''__setattr__''):
obj[key] = val
Aquí está la documentación de Python 2.7
Si también tiene que manejar clases personalizadas que se comportan como diccionarios pero no están subclasificadas de dict, puede usar getattr para obtener la función que necesita.
# loop
# ... more code
someObject = getObject(..)
try:
getattr(someObject, "update")("someValue")
except AttributeError:
# Wasn''t a type we can handle
use isinstance
, no hay nada de malo en ello y se usa habitualmente en el código que requiere recursión.
Si por similar a dict
isinstance
la clase del objeto isinstance
del dict
, isinstance
también devolverá True
.
>>> class A(dict):
pass
>>> a = A()
>>> isinstance(a, dict)
True