Python 2 и Python 3 встроенная функция all () не работает одинаково - PullRequest
0 голосов
/ 05 марта 2020

Следующий код:

a = None
b = None
all([a, b, a > b]) # Returns False in python 2 but TypeError in python 3

Ошибка в python 3:

TypeError: '>' not supported between instances of 'NoneType' and 'NoneType'

Кажется, что версия python 2 имеет короткое замыкание, но python 3 версии нет. Это тот случай? Почему это происходит? Это ошибка? Должен ли я сообщить об этом?

Я тестировал этот код в Python 2.7.17, 3.6.9 и 3.8.2

Ответы [ 2 ]

4 голосов
/ 05 марта 2020

Короткое замыкание не имеет значения. Весь список оценивается перед выполнением all.

Python 2 более допустим при сравнении. В Python 2 вы можете использовать < между строками и целыми числами, множество различных типов объектов и None без ошибок. В Python 3 правила были ужесточены, поэтому вы можете использовать < только в тех случаях, когда оно имеет четкое значение.

Если вам нужна функциональность

a and b and a > b

, тогда Я предлагаю вам использовать это. Для этого выражения a > b не будет оцениваться, если a или b равно None.

2 голосов
/ 05 марта 2020

Не баг, это предназначено.

Python 3 должно быть улучшением по сравнению с Python 2. И логически это должно дать вам ошибку, потому что вы не можете сравнить, если нет ничего лучше чем что-то, потому что, ну, это ничего!

Также нет смысла использовать Python 2, если только у вас нет какого-то устаревшего кода, который требует is (но даже тогда я бы попытался перейти на Python 3 ) как поддержка Python 2 остановлена ​​01/01/2020

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...