前两天再阅读2.3.4节时看到了具名元组,但是当时没有想太多,以为就是给参数创建元组就完事儿了,结果今天回头看了一下,发现跟当时想的不太一样,结合官方文档总结了一下。
首先,具名元组的意义就是用来标识元组标识的意义,因为直接创建元组的方法并不能使程序的阅读人员理解元组中的参数代表什么意义,使用具名元组可以解决这个问题,元组名,元组的各个字段的名字。下面还是结合文档内容对照看一下。
collections.namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)
返回一个新的元组子类,名为
typename
。这个新的子类用于创建类元组的对象,可以通过字段名来获取属性值,同样也可以通过索引和迭代获取值。子类实例同样有文档字符串(类名和字段名)另外一个有用的___repr__() 方法,以 name=value 格式列明了元组内容。
field_names
是一个像 [‘x’, ‘y’] 一样的字符串序列(
可迭代对象
)。同时
field_names可以是一个纯字符串
,用空白或逗号分隔开元素名,比如 ‘x y’ 或者 ‘x, y’ 。任何有效的Python标识符都可以作为字段名,除了下划线开头的那些。有效标识符由字母,数字,下划线组成,但首字母不能是数字或下划线,另外
不能是关键词keyword
比如 class, for, return, global, pass, 或 raise 。如果
rename
为真, 无效字段名会自动转换成位置名。比如 [‘abc’, ‘def’, ‘ghi’, ‘abc’] 转换成
[‘abc’, ‘_1’, ‘ghi’, ‘_3’] , 消除关键词 def 和重复字段名 abc 。
defaults
可以为 None 或者是一个默认值的 iterable
。如果一个默认值域必须跟其他没有默认值的域在一起出现,defaults 就应用到最右边的参数。比如如果域名 [‘x’, ‘y’, ‘z’]
和默认值 (1, 2) ,那么 x 就必须指定一个参数值 ,y 默认值 1 , z 默认值 2 。如果 module 值有定义,命名元组的
module
属性值就被设置。命名元组实例没有字典,所以它们要更轻量,并且占用更小内存。
要支持封存操作,应当将命名元组类赋值给一个匹配 typename 的变量。
上面的定义讲到几个参数的使用,typename就是我们创建的元组子类的类名(为什么说是类名,我一开始也没有想明白就忽略了,现在回头看一下,发现其实创建具名元组就像是类的实例化,如下tokyo=City(‘Tokyo’,‘Jp’,32.3),再想想类的实例化还真是那么回事儿。)另外赋值运算符左边的City就是参数类名,两者保持一致就可以了。
from collections import namedtuple
City=namedtuple('City','name country population')
tokyo=City('Tokyo','Jp',32.3)
print(tokyo)
书上还讲了另一个参数,是类的各个字段的名字,有两种标识方式,一种就是可迭代对象,列表、元组,另一种就是一个字符串里面用空格分隔字段名。[‘x’,‘y’,‘z’]或‘x y z’。