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
dir
comando, que le mostrará los campos para cualquier objeto ... que hubiera mostrado la_asdict
función directamente.dict
lugar 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á.dir
es 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
_asdict
provisto 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
_asdict
era 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
_asdict
que 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
namedtuple
instancias 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_asdict
debería ser confiable. En algunas versiones_asdict
se marcó como obsoleto, pero los comentarios indican que este ya no es el caso a partir de 3.4.fuente
_asdict
método ha quedado obsoleto en python3 (a favor de vars)vars
funciona en algunas versiones anteriores: en 2.7 genera unaTypeError
, ya que lanamedtuple
clase 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_asdict
mé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