from collections import namedtuple
foo_a = namedtuple("foo_a", ["a1", "a2", "a3"])
foo_b = namedtuple("foo_b", ["b1", "b2", "b3"])
a = foo_a(1, 2, 3)
b = foo_b(4, 5, 6)
a + b # -> (1, 2, 3, 4, 5, 6)
type(a + b) # -> tuple
namedtuples 的 add 方法似乎会返回一个元组,但我找不到此行为的文档。这种行为对我来说似乎很奇怪。
Python 的命名元组经过精心构建,因此它们是元组的子类 - 这意味着它们在每个可能的机会中都会像元组一样表现。当然,最常用的是通过数字索引而不是通过命名属性获取其值的能力:这使得它们能够在以前需要元组将不相关的值绑定在一起的地方“插入”替换.
使用“+”来连接元组,或者将元组连接到其他可迭代对象是明确定义的。另一方面,连接命名元组的命名属性不仅没有意义,因为如果生成的实体是“双长度命名元组”且每个字段重复两次,则会导致名称冲突。
更改行为以递归地添加每个字段,除了对大多数命名元组不一定有意义之外,还会破坏命名元组与元组的兼容性。就像在尝试将命名元组添加到任何其他序列时简单地引发
TypeError
一样:因为命名元组 is 是一个元组,所以预期的结果对象也是一个元组。
考虑到这些要点,我认为这种行为实际上并没有什么令人惊讶的。