Tengo una clase de tupla con nombre en Python
class Town(collections.namedtuple('Town', [
'name',
'population',
'coordinates',
'population',
'capital',
'state_bird'])):
# ...
Me gustaría convertir las instancias de Town en diccionarios. No quiero que esté rígidamente vinculado a los nombres o al número de campos en una ciudad.
¿Hay alguna manera de escribirlo para poder agregar más campos o pasar una tupla con un nombre completamente diferente y obtener un diccionario?
No puedo alterar la definición de clase original como está en el código de otra persona. Entonces necesito tomar una instancia de una ciudad y convertirla en un diccionario.
python
dictionary
tuples
namedtuple
Sin mí, simplemente Aweso
fuente
fuente

dircomando, que le mostrará los campos para cualquier objeto ... que hubiera mostrado la_asdictfunción directamente.dictlugar de 'namedtuple' y pasar la namedtuple al inicializador. Recuerda que si estás acostumbrado a Cxx,class Town(x)no es el constructor,def __init__(self, *args, **kwargs)dentro está.dires solo un python incorporado ... puede ejecutarlo en cualquier objeto de python, en una consola o en un script (donde devuelve una lista que puede imprimir o hacer lo que sea), y devolverá una lista de (casi ) todos los atributos del objeto. útil si está tratando de descubrir cómo funciona un objeto desconocido.Respuestas:
TL; DR: hay un método
_asdictprovisto para esto.Aquí hay una demostración del uso:
Este es un método documentado de nombre de tuplas, es decir, a diferencia de la convención habitual en Python, el guión bajo del nombre del método no está ahí para desalentar su uso . Junto con los otros métodos añadidos a namedtuples,
_make,_replace,_source,_fields, tiene el carácter de subrayado sólo para tratar de evitar conflictos con los nombres de los campos posibles.Nota: Para algunos códigos 2.7.5 <versión de python <3.5.0 en estado salvaje, es posible que vea esta versión:
Durante un tiempo la documentación había mencionado que
_asdictera obsoleto (ver aquí ), y sugirió utilizar la incorporada en el método de vars . Ese consejo ahora está desactualizado; Para corregir un error relacionado con la subclasificación, esta confirmación__dict__ha eliminado nuevamente la propiedad que estaba presente en namedtuples .fuente
_asdictque no debería tener un alias en la biblioteca estándarasdict?"asdict"sido uno de los nombres de las tuplas.Hay un método incorporado en
namedtupleinstancias para esto_asdict,.Como se discutió en los comentarios, en algunas versiones
vars()también lo hará, pero aparentemente depende en gran medida de los detalles de construcción, aunque_asdictdebería ser confiable. En algunas versiones_asdictse marcó como obsoleto, pero los comentarios indican que este ya no es el caso a partir de 3.4.fuente
_asdictmétodo ha quedado obsoleto en python3 (a favor de vars)varsfunciona en algunas versiones anteriores: en 2.7 genera unaTypeError, ya que lanamedtupleclase de esa versión no tiene un__dict__atributo.En las versiones Ubuntu 14.04 LTS de python2.7 y python3.4, la
__dict__propiedad funcionó como se esperaba. El_asdictmétodo también funcionó, pero me inclino a usar la API de propiedad uniforme y definida por estándares en lugar de la API no uniforme localizada.$ python2.7
Ver como dict es la forma semántica de obtener un diccionario que represente algo, (al menos a mi leal saber y entender).
Sería bueno acumular una tabla de las principales versiones y plataformas de Python y su soporte para
__dict__, actualmente solo tengo una versión de plataforma y dos versiones de Python como se publicó anteriormente.fuente
__dict__no funciona.Caso # 1: tupla de una dimensión
Caso # 2: tupla de dos dimensiones
Ejemplo: DICT_ROLES [961] # mostrará 'Programador de fondo'
fuente
si no _asdict (), puede usarlo de esta manera:
fuente
Python 3. Asignar cualquier campo al diccionario como el índice requerido para el diccionario, utilicé 'nombre'.
fuente