为什么具有多个(全部)None 值的元组的计算结果为 True?

Why does a tuple with more than one (all) None value evaulate to True?

为什么一个元组

具有一个 None 元素的元组:

>>> metadata = (None)
>>> if metadata:
...     print("True")
... else:
...     print("False")
...
False

具有一个或多个 None 个元素的元组:

>>> metadata = (None, None)
>>> if metadata:
...     print("True")
... else:
...     print("False")
...
True

当元组中有多个 None 元素时,我想使用

>>> if all(metadata):
...     print("True")
... else:
...     print("False")
...
False

得到我想要的结果(也就是说,如果元组中的所有值都是None,我希望它实现它的评估为None)。

当对元组求值时,求值时实际上考虑的是它的长度,而不是它的值的短路吗?这种实施背后的基本原理是什么?

>>> len(metadata)
2
>>>

metadata 在您的第一个代码片段中不是元组:

>>> metadata = (None)
>>> type(metadata)
<class 'NoneType'>

metadata = (None) 等同于 metadata = None。要使其成为单元素元组,请使用尾随逗号:

metadata = (None,)

现在您可以看到一个元素元组和多个元素元组的工作方式相同。

if metadata: 是空元组的 False

metadata = ()

if metadata:
    print("True")
else:
    print("False")

# False

对于一个包含所有 None 条目的元组 return False,您可以不使用 if 结构,例如:

>>> not all(x == None for x in metadata)

metadata 变量不是元组。它的值是 None,这就是为什么 if metadata returns False.

metadata = (None)
if metadata:
    print("True")
else:
    print("False")
# False

这个metadata变量是一个元组。这不是一个空元组。所以if metadata条件returnsTrue.

metadata = (None, None)
if metadata:
    print("True")
else:
    print("False")
# True

如果 metadata 元组不包含空数据或 Noneall(metadata) 将返回 True。但是在这种情况下 all(metadata) returns False.

if all(metadata):
    print("True")
else:
    print("False")
# False

引用自: https://docs.python.org/3/library/functions.html#all

Return True if all elements of the iterable are true (or if the iterable is empty). Equivalent to:

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

所以如果 metadata 是一个空的可迭代对象,all(metadata) 会返回 True