从namedtuple获取值的名称

49

我有一个包含集合的模块:

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(一个对象),而是例如DepartureTimeASCArrivalTimeASC这样的值。

我该如何获取这个名称?

2个回答

89

如果您想获取实际名称,请使用 _fields 属性:

from collections import namedtuple

Point = namedtuple('Point', 'x, y')
p = Point(x=1, y=2)
for name in Point._fields:
    print(name, getattr(p, name))

4
访问类的受保护成员/函数(例如 _fields,_asdict())是否被推荐? - awwwd
对于 Python 3+,请使用 print(f"{name}: {getattr(p, name)}") - cowlinator
@awwwd 这些不是受保护的成员,它们都有文档说明(_fields_asdict)。 - wim

38
from itertools import izip

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

你还可以使用 FlightsResultsSorter._asdict() 来获得一个字典。


6
有没有其他方法可以在不访问namedtuple的私有成员的情况下完成这个操作? - user3885927
10
这些不被视为私有成员——使用下划线约定仅是为了避免与名称为“_fields”的字段发生冲突。 - Michael Scott Asato Cuthbert
6
不对。在字段前添加“_”表示它是私有的。在字段后添加“fields_”是为了避免冲突所使用的。 - Younes El Ouarti
5
它们已经公开记录了,文档中有以下前言:“为了避免与字段名称冲突,方法和属性名称以下划线开头。”你可以说它们的命名不太理想,不符合惯例,但它们明确不是私有的。 - Michael Ekoka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接