python 映射名称到序列元素

问题

你有一段通过下标访问列表或者元组中元素的代码,但是这样有时候会使得你的代码难以阅读, 于是你想通过名称来访问元素。

实现

通过 collections.namedtuple() 函数实现上述问题。 这个函数实际上是一个返回 Python 中标准元组类型子类的一个工厂方法。 你需要传递一个类型名和你需要的字段给它,然后它就会返回一个类,你可以初始化这个类,为你定义的字段传递值等。 代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
>>> from collections import namedtuple

>>> Subscriber = namedtuple('Subscriber', ['addr', 'joined'])
>>> sub = Subscriber('jonesy@example.com', '2012-10-19')
>>> sub
Subscriber(addr='jonesy@example.com', joined='2012-10-19')
>>> sub.addr
'jonesy@example.com'
>>> sub.joined
'2012-10-19'

注:尽管 namedtuple 的实例看起来像一个普通的类实例,但是它跟元组类型是可交换的,支持所有的普通元组操作,比如索引和解压。

说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

>>> from collections import namedtuple

>>> Subscriber = namedtuple('Subscriber', ['addr', 'joined'])
>>> sub = Subscriber('jonesy@example.com', '2012-10-19')
>>> sub
Subscriber(addr='jonesy@example.com', joined='2012-10-19')

# 实例方法
>>> [x for x in dir(sub) if "__" not in x]
['_asdict', '_fields', '_fields_defaults', '_make', '_replace', 'addr', 'count', 'index', 'joined']

# sub._asdict()
Return a new OrderedDict which maps field names to their values.
>>> sub._asdict()
OrderedDict([('addr', 'jonesy@example.com'), ('joined', '2012-10-19')])

# sub._fields
Return a fileds
>>> sub._fields
('addr', 'joined')

# _replace(_self, **kwds)
Return a new Subscriber object replacing specified fields with new values
>>> sub._replace(joined='2018-10-10')
Subscriber(addr='jonesy@example.com', joined='2018-10-10')

# _make(iterable) from builtins.type
Make a new Subscriber object from a sequence or iterable
>>> sub._make(('xiai@qq.com', '2018-10-11'))
Subscriber(addr='xiai@qq.com', joined='2018-10-11')

# addr
Alias for field number 0
>>> sub.addr
'jonesy@example.com'

# joined
Alias for field number 1
>>> sub.joined
'2012-10-19'

# count(self, value, /)
Return number of occurrences of value.

# index(self, value, start=0, stop=9223372036854775807, /)
Return first index of value.
Raises ValueError if the value is not present.
-------------本文结束感谢您的阅读-------------