source: https://blog.csdn.net/songfreeman/article/details/50502194
标准的tuple类型使用数字索引来访问元素,
bob = ('Bob', 30, 'male')
print('Representation:', bob)
jane = ('Jane', 29, 'female')
print('\nField by index:', jane[0])
print('\nFields by index:')
for p in [bob, jane]:
print('%s is a %d year old %s' % p)
这种对于标准的元组访问,我们需要知道元素对应下标索引值,但当元组的元素很多时,我们可能无法知道每个元素的具体索引值,这个时候就是可命名元组登场的时候了。
nametuple 的创建是由自己的类工厂nametuple()进行创建,而不是由标准的元组来进行实例化,通过nametuple()创建类的参数包括类名称和一个包含元素名称的字符串
from collections import namedtuple
#创建一个nametuplede 类,类名称为Person,并赋给变量P
P = namedtuple('Person', 'name,age,gender')
print('Type of Person:', type(P)) # Type of Person:
#通过Person类实例化一个对象bob
bob = P(name='Bob', age=30, gender='male')
print('\nRepresentation:', bob) # Representation: Person(name='Bob', age=30, gender='male')
#通过Person类实例化一个对象jane
jane = P(name='Jane', age=29, gender='female')
print('\nField by name:', jane.name) # Field by name: Jane
print('\nFields by index:')
for p in [bob, jane]:
print('%s is a %d year old %s' % p)
# Fields by index:
# Bob is a 30 year old male
# Jane is a 29 year old female
通过上面的实例可以看出,我们通过nametuple()创建了一个Person的类,并复制给P变量,Person的类成员包括name,age,gender,并且顺序已经定了,在实例化zhangsan这个对象的时候,对张三的属性进行了定义。这样我们在访问zhangsan这个元组的时候就可以通过张三的属性来复制(zhangsan.name、zhangsan.age等)。这样就算这个元组有1000个元素我们都能通过元素的名称来访问而不用考虑元素的下标索引值。
非法的参数值
使用nametuple()来创建类的时候,传递的成员属性参数名称不能非法(不能为系统参数名称),且参数名称不能重复,否则会报值错误
# 参数字段的名称非法,包含系统名称class
try:
p = namedtuple('Person','age,name,class,gender')
print(p._fields)
except ValueError as err:
print(err)
# Type names and field names cannot be a keyword: 'class'
# 类成员字段参数名称重复 age
try:
p1 = namedtuple('Person','age,gender,name,age')
print(p1._fields)
except ValueError as err:
print(err)
# Encountered duplicate field name: 'age'
但是也有时候我们是无法控制的,如果参数的名称来自外部,比如是通过读取数据库中的内容来传递的参数,此时我们无法手工的修改参数名称,那该如何是好呢! 别担心,只需要增加一个属性就OK了,它就是rename
# 参数字段的名称非法,包含系统名称class
try:
p = namedtuple('Person','age,name,class,gender',rename=True)
print(p._fields)
except ValueError as err:
print(err)
# ('age', 'name', '_2', 'gender')
# 类成员字段参数名称重复 age
try:
p1 = namedtuple('Person','age,gender,name,age',rename=True)
print(p1._fields)
except ValueError as err:
print(err)
# ('age', 'gender', 'name', '_3')
从以上的实例我们看出,当有参数错误的时候,系统自动将错误的参数通过增加 "下划线+参数索引" 的方式自动将参数名称替换了。