函数原型
python3.7中的原型,python3.6仅仅是少了defaults参数
collections.
namedtuple
(typename, field_names, *, rename=False, defaults=None, module=None)
函数功能
命名元组的工厂函数,用于构建只含有少量属性,没有方法的类。命名元组赋予每个位置一个含义,提供可读性和自文档性。它们可以用于任何普通元组,并添加了通过名字获取值的能力,通过索引值也是可以的。
参数说明
typename,表示返回元组子类,和元组的区别在于可以通过域名(参数field_names)来获取属性值。当然,和元组相同,也可以通过索引和迭代获取值。
field_names, 可以是像 [‘x’, ‘y’]
一样的字符串序列,也可以是一个纯字符串,用空白或逗号分隔开元素名,比如 'x y'
或者 'x, y'
。任何非下划线开头的Python 标识符都可以充当域名。另外域名也不能是关键词 keyword, 比如 class, for, return, global等。
rename ,如果为真,无效域名会自动转换成位置名。比如 ['abc', 'def', 'ghi', 'abc']
转换为 ['abc', '_1', 'ghi', '_3']
,使用“下换线+下标”的名称替换掉无效关键词 def
和重复域名 abc
。看到这里应该会有疑问,这不就和面说的不能以下划线开头矛盾了吗?注意,这里是当rename参数为真时,python为我们替换的,而直接使用“_1”、“_3”这样的域名同样会被告知域名错误。
defaults, 可以为 None
或者是一个默认值的 iterable 。如果一个默认值域必须跟其他没有默认值的域在一起出现,defaults 就应用到最右边的参数。比如如果域名 ['x', 'y', 'z']
和默认值 (1, 2)
,那么 x
就必须指定一个参数值 ,y
默认值 1
, z
默认值 2
。请注意,python3.7后才添加的defaults参数和 _field_defaults
属性。
module,用于设置命名元组的 __module__
属性值。
支持的方法和属性
除了继承自元组的通用方法外,namedtuple还支持三个额外的方法和两个属性。为了防止域名冲突,方法和属性以下划线开始。
classmethod somenamedtuple. _make (iterable) | 类方法,从存在的序列或迭代实例创建一个新实例。 |
| 返回一个新的 dict ,它将字段名称映射到它们对应的值; |
| 返回一个新的命名元组实例,并将指定域替换为新的值; |
| 字符串元组列出了域名。用于提醒和从现有元组创建一个新的命名元组类型; |
| 默认值的字典,python3.7之后添加 |
函数和属性举例
>>> t = [11, 22]
>>> Point._make(t)
Point(x=11, y=22)
>>> p = Point(x=11, y=22)
>>> p._asdict()
OrderedDict([('x', 11), ('y', 22)])
>>> p = Point(x=11, y=22)
>>> p._replace(x=33)
Point(x=33, y=22)
>>> p._fields # 查看现有的域名
('x', 'y')
>>> Color = namedtuple('Color', 'red green blue')
>>> Pixel = namedtuple('Pixel', Point._fields + Color._fields)
>>> Pixel(11, 22, 128, 255, 0)
Pixel(x=11, y=22, red=128, green=255, blue=0)