2011-07-04 72 views
25

我有收集模块:获得的值名称从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) 
) 

,并在另一模块我通过这个集合迭代,我想获得项目名称:

for x in FlightsResultsSorter: 
      self.sort(x) 

所以在在代码上,我想代替x(这是对象)传递例如“DepartureTimeASC”或“ArrivalTimeASC”。

我怎样才能得到这个名字?

问候

回答

23
from itertools import izip 

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

您还可以使用FlightsResultsSorter._asdict()得到的字典。

+0

有没有其他的方式来做到这一点,而不访问namedtuple的私人成员? – user3885927

+2

这些不被认为是私人成员 - 公约只是为了避免与称为_fields的字段发生冲突。 –

48

如果你想获得实际的名称,使用_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