【发布时间】:2016-03-24 02:37:42
【问题描述】:
当 Python 元组在布尔上下文中使用时,当且仅当它不为空时,它才会被视为 True。
这同样适用于collections.namedtuple 的实例吗?
【问题讨论】:
标签: python boolean namedtuple
当 Python 元组在布尔上下文中使用时,当且仅当它不为空时,它才会被视为 True。
这同样适用于collections.namedtuple 的实例吗?
【问题讨论】:
标签: python boolean namedtuple
是的,但通常您可能永远不会看到它发生,因为您为namedtuple 中的每个值指定了名称。不指定名称将允许您创建一个空元组类型,但这样的类型不会很有用,因为它的实例将始终为空:
>>> empty = collections.namedtuple("empty", [])
>>> empty()
empty()
>>> bool(empty())
False
【讨论】:
是的。您可以通过检查命名元组类来看到这一点。
这样做的一种方法是查看命名元组类的源代码,在 Python 3.3 或更高版本中使用._source,或namedtuple() 的verbose=True 选项。您将看到命名元组扩展了tuple,并且不会覆盖__nonzero__() 或__len__() 方法。这意味着他们使用与tuple 相同的逻辑,就像您想的那样。
您还可以检查命名元组类的 __nonzero__ 和 __len__ 属性。您会看到它没有定义__nonzero__ 属性,并且__len__ 属性与tuple 的属性相同:
>>> A = namedtuple('A', ['x'])
>>> A.__len__ == tuple.__len__
True
【讨论】:
理论上是可以的,但是你不能创建任何有用的namedtuple的空实例,因为当你创建namedtuple类型时,你必须预先指定元素的数量。因此,您可以拥有一个空的 namedtuple 的唯一方法是拥有一个始终为空的 namedtuple 类型,在这种情况下它没有任何用处。
【讨论】:
namedtuples 总是真实的?