Почему кортеж с более чем одним (всем) значением None соответствует True? - PullRequest
0 голосов
/ 06 июля 2019

Почему кортеж с

  • Одинокий Ни один элемент не оценивает (правильный и предполагаемый) Ложь
  • больше чем одно (но все) Ни одно из значений не соответствует 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
>>>

Ответы [ 2 ]

0 голосов
/ 06 июля 2019

Эта переменная 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

Возвращает True, если все элементы повторяемыистинны (или если итерируемый пустой).Эквивалентно:

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

Так что, если бы metadata был пустой итерацией, all(metadata) вернул бы True.

0 голосов
/ 06 июля 2019

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, например:

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