从namedtuple获取值的名称

use*_*618 33 python 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)
)
Run Code Online (Sandbox Code Playgroud)

在另一个模块中,我按此集合进行迭代,我想得到项目的名称:

for x in FlightsResultsSorter:
            self.sort(x)
Run Code Online (Sandbox Code Playgroud)

所以在代码中我想要代替x(对象)传递例如"DepartureTimeASC"或"ArrivalTimeASC".

我怎么能得到这个名字?

最好的祝福

ars*_*ars 66

如果您要获取实际名称,请使用以下_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
Run Code Online (Sandbox Code Playgroud)

  • 是否建议访问类的受保护成员/函数(例如 _fields、_asdict())? (4认同)

jd.*_*jd. 30

from itertools import izip

for x, field in izip(FlightsResultsSorter, named_tuple_sex._fields):
    print x, field
Run Code Online (Sandbox Code Playgroud)

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

  • 有没有其他方法可以在不访问命名元组的私有成员的情况下执行此操作? (6认同)
  • @YounesEO它们是公开记录的,并且文档有这些前言*为了防止与字段名称冲突,方法和属性名称以下划线开头。*您可以说它们的命名不理想并且不遵守约定,但它们绝对不是私有的。 (5认同)
  • 这些不被视为私有成员 - 惯例只是为了避免与名为_fields的字段发生冲突. (4认同)
  • 这不是真的。前置 (_field) 意味着它是私有的。追加 (fields_) 是用来避免冲突的。 (3认同)