实际上 collections.namedtuple() 是一个工厂方法,它返回的是python中标准元组类型的子类。我们提供给它一个类型名称以及相应的字段,它就返回一个可实例化的类为你已经定义好的字段传入值等。
1
2
3
4
5
6
7
8
9
|
from collections import namedtuple
Subscriber = namedtuble( 'Subscriber' , [ 'addr' , 'joined' ])
sub = Subscriber( 'jonesy@example.com' , '2012-10-19' )
print (sub)
# Subscriber(addr='jonesy@example.com', joined='2012-10-19')
print (sub.addr)
# 'jonesy@example.com'
print (sub.joined)
# '2012-10-19'
|
尽管namedtuple的实例看起来像一个普通的类实例,但它的实例与普通的元组是可互换的,而且支持所有普通元组所支持的操作。例如:索引和分解
1
2
3
4
5
6
7
|
print ( len (sub))
# 2
addr, joined = sub
print (addr)
# 'jonesy@example.com'
print (joined)
# '2012-10-19'
|
命名元组的主要作用在于将代码同它所控制的元素位置间解耦。所以,如果从数据库调用中得到一个大型的元组列表,而且通过元素的位置来访问数据,那么假如在表单中新增了一列数据,那么代码就会崩溃。但如果首先将返回的元组转型为命名元组,就不会出现问题。
1
2
3
4
5
6
7
8
9
10
|
from collections import namedtuple
Stock = namedtuple( 'Stock' , [ 'name' , 'shares' , 'price' ])
def compute_cost(records):
total = 0.0
for rec in records:
s = Stock( * rec)
total + = s.shares * s.price
# 若此处为 total += s[1] * s.[2] 则数据一变,代码也不对
return total
|
注意:namedtuple 是不可变的 (immutable)
1
2
3
4
5
6
7
|
s = Stock( 'ACEM' , 100 , 123.45 )
print (s)
# Stock(name='ACME', share=100, price=123.45)
s.share = 75
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# AttributeError: can't set attribute
|
如果需要修改任何属性,可以通过使用 namedtuple 实例的 _replace() 方法来实现,该方法创建了一个全新的命名元组,并对相应的值做替换。
1
2
3
|
s = s._replace(share = 75 )
print (s)
# Stock(name='ACME', share=75, price=123.45)
|
_replace() 方法有一个微妙的用途,那就是它可以作为一种简便的方法填充具有可选或缺失字段的命名元组。要做到这点,首先创建一个包含默认值的“原型”元组,然后使用 _replace() 方法创建一个新的实例,把相应的值替换掉
1
2
3
4
5
6
7
|
from collection import namedtuple
Stock = namedtuple( 'Stock' , [ 'name' , 'share' , 'price' , 'data' , 'time' ])
# Create a prototype instance
stock_prototype = Stock('', 0 , 0.0 , None , NOne)
# Function to convert a dictionary to a Stock
def dict_to_stock(s):
return stock_prototype.replace( * * s)
|
让我们来演示一下上面的代码是如何工作的:
1
2
3
4
5
6
|
>>> a = { 'name' : 'ACME' , 'shares' : 100 , 'price' : 123.45 }
>>> dict_to_stock(a)
Stock(name = 'ACME' , shares = 100 , price = 123.45 , date = None , time = None )
>>> b = { 'name' : 'ACME' , 'shares' : 100 , 'price' : 123.45 , 'date' : '12/17/2012' }
>>> dict_to_stock(b)
Stock(name = 'ACME' , shares = 100 , price = 123.45 , date = '12/17/2012' , time = None )
|
如果我们的目标是定义一个高效的数据结构,而且将来会修改各种实例属性,那么使用 namedtuple 并不是最佳选择
以上就是python教程命名元组示例分析的详细内容,更多关于python命名元组的资料请关注服务器之家其它相关文章!
原文链接:https://blog.csdn.net/chenyuhuaxin/article/details/100631619