【问题标题】:Python namedtuple in a boolean context布尔上下文中的 Python namedtuple
【发布时间】:2016-03-24 02:37:42
【问题描述】:

当 Python 元组在布尔上下文中使用时,当且仅当它不为空时,它才会被视为 True

这同样适用于collections.namedtuple 的实例吗?

【问题讨论】:

    标签: python boolean namedtuple


    【解决方案1】:

    是的,但通常您可能永远不会看到它发生,因为您为namedtuple 中的每个值指定了名称。不指定名称将允许您创建一个空元组类型,但这样的类型不会很有用,因为它的实例将始终为空:

    >>> empty = collections.namedtuple("empty", [])
    >>> empty()
    empty()
    >>> bool(empty())
    False
    

    【讨论】:

      【解决方案2】:

      是的。您可以通过检查命名元组类来看到这一点。

      这样做的一种方法是查看命名元组类的源代码,在 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
      

      【讨论】:

        【解决方案3】:

        理论上是可以的,但是你不能创建任何有用的namedtuple的空实例,因为当你创建namedtuple类型时,你必须预先指定元素的数量。因此,您可以拥有一个空的 namedtuple 的唯一方法是拥有一个始终为空的 namedtuple 类型,在这种情况下它没有任何用处。

        【讨论】:

        • 所以,澄清一下,有用的namedtuples 总是真实的?
        • @PaulBaker:是的,因为它们总是非空的。
        猜你喜欢
        • 2014-02-15
        • 1970-01-01
        • 1970-01-01
        • 2019-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多