2011-07-04 16 views
25

tengo un módulo con la colección:obtener el nombre de valor de namedtuple

import collections 
named_tuple_sex = collections.namedtuple(
        'FlightsResultsSorter', 
         ['TotalPriceASC', 
         'TransfersASC', 
         'FlightTimeASC', 
         'DepartureTimeASC', 
         'DepartureTimeDESC', 
         'ArrivalTimeASC', 
         'ArrivalTimeDESC', 
         'Airlines'] 
        ) 
FlightsResultsSorter = named_tuple_sex(
    FlightsResultsSorter('TotalPrice', SortOrder.ASC), 
    FlightsResultsSorter('Transfers', SortOrder.ASC), 
    FlightsResultsSorter('FlightTime', SortOrder.ASC), 
    FlightsResultsSorter('DepartureTime', SortOrder.ASC), 
    FlightsResultsSorter('DepartureTime', SortOrder.DESC), 
    FlightsResultsSorter('ArrivalTime', SortOrder.ASC), 
    FlightsResultsSorter('ArrivalTime', SortOrder.DESC), 
    FlightsResultsSorter('Airlines', SortOrder.ASC) 
) 

y en otro módulo de E iterar por esta colección y quiero obtener el nombre del artículo:

for x in FlightsResultsSorter: 
      self.sort(x) 

por lo que en sobre el código quiero en cambio x (que es el objeto) que pasa, por ejemplo, "DepartureTimeASC" o "ArrivalTimeASC".

¿Cómo puedo obtener este nombre?

Saludos

Respuesta

23
from itertools import izip 

for x, field in izip(FlightsResultsSorter, named_tuple_sex._fields): 
    print x, field 

También se puede utilizar para obtener una FlightsResultsSorter._asdict() dict.

+0

¿Hay alguna otra manera de hacer esto sin tener que acceder a un miembro privado de la tilde nombrada? – user3885927

+2

estos no se consideran miembros privados; la convención _ es solo para evitar colisiones con, digamos, un campo llamado _campos. –

48

Si usted está tratando de obtener los nombres reales, utilizan el atributo _fields:

In [50]: point = collections.namedtuple('point', 'x, y') 

In [51]: p = point(x=1, y=2) 

In [52]: for name in p._fields: 
    ....:  print name, getattr(p, name) 
    ....: 
x 1 
y 2 
Cuestiones relacionadas