J'ai une classe de tuple nommée en python
class Town(collections.namedtuple('Town', [
'name',
'population',
'coordinates',
'population',
'capital',
'state_bird'])):
# ...
J'aimerais convertir les instances de Town en dictionnaires. Je ne veux pas qu'il soit strictement lié aux noms ou au nombre de champs dans une ville.
Existe-t-il un moyen de l'écrire de telle sorte que je puisse ajouter plus de champs, ou passer un tuple nommé entièrement différent et obtenir un dictionnaire.
Je ne peux pas modifier la définition de classe d'origine car elle est dans le code de quelqu'un d'autre. Je dois donc prendre une instance d'une ville et la convertir en dictionnaire.
python
dictionary
tuples
namedtuple
Sans moi, c'est juste Aweso
la source
la source
dir
commande, qui vous montrera les champs pour n'importe quel objet ... qui aurait montré la_asdict
fonction directement.dict
au lieu de 'namedtuple', et passez le namedtuple dans l'initialiseur. N'oubliez pas que si vous êtes habitué à Cxx, ceclass Town(x)
n'est pas le constructeur, à l'def __init__(self, *args, **kwargs)
intérieur.dir
est juste un python intégré ... vous pouvez l'exécuter sur n'importe quel objet python, dans une console ou dans un script (où il renvoie une liste que vous pouvez imprimer ou faire quoi que ce soit avec), et il renverra une liste de (presque ) tous les attributs de l'objet. utile si vous essayez de comprendre comment fonctionne un objet inconnu.Réponses:
TL; DR: une méthode est
_asdict
fournie pour cela.Voici une démonstration de l'utilisation:
C'est une méthode documentée de namedtuples, c'est-à-dire contrairement à la convention habituelle en python, le trait de soulignement principal sur le nom de la méthode n'est pas là pour décourager l'utilisation . Avec les autres méthodes ajoutées à namedtuples,
_make
,_replace
,_source
,_fields
, il a souligné que pour essayer de prévenir les conflits avec les noms de champs possibles.Remarque: pour certains codes 2.7.5 <python version <3.5.0 à l'état sauvage, vous pouvez voir cette version:
Pendant un certain temps, la documentation avait mentionné que
_asdict
c'était obsolète (voir ici ), et suggéré d'utiliser la méthode intégrée vars . Cet avis est maintenant dépassé; afin de corriger un bug lié au sous-__dict__
classement , la propriété qui était présente sur les namedtuples a de nouveau été supprimée par ce commit .la source
_asdict
ne pas être aliasé dans la bibliothèque standardasdict
?"asdict"
être l'un des noms de tuple.Il existe une méthode intégrée sur les
namedtuple
instances pour cela_asdict
,.Comme discuté dans les commentaires, sur certaines versions le
vars()
fera également, mais cela dépend apparemment fortement des détails de construction, alors qu'il_asdict
devrait être fiable. Dans certaines versions a_asdict
été marqué comme obsolète, mais les commentaires indiquent que ce n'est plus le cas à partir de la 3.4.la source
_asdict
méthode a été obsolète dans python3 (en faveur de vars)vars
cela ne fonctionne pas sur certaines versions plus anciennes - sur 2.7, cela déclenche unTypeError
, car lanamedtuple
classe de cette version n'a pas d'__dict__
attribut.Sur les versions Ubuntu 14.04 LTS de python2.7 et python3.4, la
__dict__
propriété fonctionnait comme prévu. La_asdict
méthode a également fonctionné, mais je suis enclin à utiliser l'API de propriété uniforme définie par les normes au lieu de l'API non uniforme localisée.$ python2.7
Voir comme dict est la manière sémantique d'obtenir un dictionnaire représentant quelque chose, (du moins à ma connaissance).
Ce serait bien d'accumuler un tableau des principales versions et plates-formes de python et de leur support pour
__dict__
, actuellement je n'ai qu'une version de plate-forme et deux versions de python comme indiqué ci-dessus.la source
__dict__
ne fonctionne pas.Cas n ° 1: tuple à une dimension
Cas n ° 2: tuple à deux dimensions
Exemple: DICT_ROLES [961] # affichera 'Back-End Programmer'
la source
si aucun _asdict (), vous pouvez utiliser cette méthode:
la source
Python 3. Allouez n'importe quel champ au dictionnaire comme index requis pour le dictionnaire, j'ai utilisé «nom».
la source