问题
通过名称来访问元素,减少结构中对位置的依赖性
解决方案
collections.namedtuple()——命名元组,只增加了极小的开销。
collections.namedtuple()是一个工厂方法,它返回的是python中标准元组类型的子类。我们提供给它一个类型名称以及相应的字段,它就返回一个可实例的类、已经定义好的字段传入值。
示例1:
from collections import namedtuple
Subsrceber = namedtuple('Subsrceber',['addr','joined'])
sub = Subsrceber('a@exame.com','2012-3-10')
print sub
#sub=Subsrceber(addr='a@exame.com', joined='2012-3-10')
print sub.addr
#sub.addr = a@exame.com
print sub.joined
#$sub.joined=2012-3-10
namedtuple的实例与普通元组是可互换的,而且支持所有普通元组所支持的操作,例如索引(indexing)和分解(unpacking);
示例2:
print len(sub)
#len(sub)=2
addr,joined = sub
print addr
#addr=a@exame.com
print joined
#joined=2012-3-10
命名元组的主要作用在于将代码同它所控制的元素位置间解耦。所以,如果从数据库调用中得到一个大型的元组列表,而且通过元素的位置来访问数据,那么假如在表单中新增一类数据,那么代码就会崩溃。但如果首先将返回的元组转型为命名元组,就不会出现问题。
namedtuple的一种可能用法是作为字典的替代,后者需要更多的空间来存储。因此,如果要构建涉及字典的大型数据结构,使用namedtuple会更加高效。注意:namedtuple是不可变的。
示例2:
Stock = namedtuple('Stock',['name','share','price'])
s=Stock('Acme',100,123)
print s
#Stock(name='Acme', share=100, price=123)
s.price=11
#AttributeError: can't set attribute
需要更改属性,使用namedtuple示例提供的_replace()方法来实现。该方法会创建一个全新的命名元组,并对相应的值做替换。
示例3:
s = s._replace(share=44)
print s
#Stock(name='Acme', share=44, price=123)
最后,如果要定义一个高效的数据结构,而且将来会修改各种实例属性,那么使用namedtuple并不是最佳选择,可以考虑定义一个使用slots属性的类。
网友评论