2011-07-04 40 views
25

Tôi có một mô-đun với bộ sưu tập:Bắt tên của giá trị từ 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) 
) 

và trong một mô-đun Tôi lặp bởi bộ sưu tập này và tôi muốn để có được tên của mục:

for x in FlightsResultsSorter: 
      self.sort(x) 

như vậy trong theo mã tôi muốn thay vì x (đó là đối tượng) đi qua ví dụ "DepartureTimeASC" hoặc "ArrivalTimeASC".

Tôi làm cách nào để có được tên này?

Trân trọng

Trả lời

23
from itertools import izip 

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

Bạn cũng có thể sử dụng FlightsResultsSorter._asdict() để có được một dict.

+0

Có cách nào khác để thực hiện việc này mà không truy cập thành viên riêng tư của tên tệp không? – user3885927

+2

chúng không được coi là thành viên riêng tư - quy ước _ chỉ để tránh xung đột với, ví dụ, một trường được gọi là _fields. –

48

Nếu bạn đang cố gắng để có được những tên tuổi thực tế, sử dụng _fields thuộc tính:

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 
Các vấn đề liên quan