为什么具有不超过一个(全部)无值的元组评估为True?

时间:2019-07-06 07:03:03

标签: python-3.x tuples evaluation

为什么用元组

  • 无罪的元素会误导为(正确和预期的)错误
  • 不止一个(但全部),没有一个值可评估为True?

带有一个None元素的元组:

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

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

>>> 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
>>>

2 个答案:

答案 0 :(得分:0)

第一个代码段中的

NSViewController不是元组:

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 项的元组返回False,可以不用以下None构造:

if

答案 1 :(得分:0)

metadata变量不是元组。它的值为None,这就是if metadata返回False的原因。

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

metadata变量是一个元组。这不是一个空的元组。因此if metadata条件返回True

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

如果metadata元组未包含空数据或None,则all(metadata)将返回True。但是在这种情况下,all(metadata)返回False

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

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

  

如果iterable的所有元素都为true(或者iterable为空),则返回True。等效于:

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

因此,如果metadata是一个空的可迭代对象,则all(metadata)将返回True