Действительно ли сравнения позволяют возвращать числа вместо логических значений и почему? ⇐ Python
-
Гость
Действительно ли сравнения позволяют возвращать числа вместо логических значений и почему?
Я нашел удивительное предложение в документации Python в разделе «Тестирование истинности»:
Операции и встроенные функции, имеющие логический результат, всегда возвращают 0 или False в случае ложности и 1 или True в случае истины, если не указано иное.
Похоже, что операторы отношения не имеют исключающих операторов, поэтому IIUC может возвращать 0 и 1 вместо False и True< /code> для значений некоторых встроенных типов (например, 7 < 3), даже недетерминировано.
Таким образом, чтобы удовлетворить спецификации, требующие от моего кода создания значений типа bool или для защитного программирования (когда это важно), следует ли мне заключать логические выражения в вызовы bool ?
Дополнительный вопрос: почему существует такая широта? Облегчает ли это работу CPython или другой реализации?
ИЗМЕНИТЬ На вопрос был дан ответ, и я принял его, но я хотел бы добавить это в PEP 285 — Добавление типа bool. Я нашел следующие утверждения:
[*]Все встроенные операции, которые концептуально возвращают логический результат, будут изменены и теперь будут возвращать False или True вместо 0 или 1; например, сравнения, оператор «не» и такие предикаты, как isinstance(). [*]Все встроенные операции, которые определены для возврата логического результата, будут изменены и теперь будут возвращать False или True вместо 0 или 1. В частности, это влияет на сравнения (=, is, is not, in, not in), унарный оператор not, встроенные функции callable(), hasattr(), isinstance() и issubclass(), метод dict has_key(), строковые и юникодные методы Endwith(), isalnum(), isalpha(), isdigit(), islower(), isspace(), istitle(), isupper() и Beginswith(), методы юникода isdecimal() и isnumeric( ) и атрибут «закрытый» файловых объектов. Предикаты в модуле оператора также изменены, чтобы возвращать логическое значение, включаяoperator.truth(). [*]Единственное, что меняется, — это предпочтительные значения для представления значений истинности при возврате или явном назначении. Раньше этими предпочтительными значениями истинности были 0 и 1; PEP изменяет предпочтительные значения на False и True и изменяет встроенные операции для возврата этих предпочтительных значений.
Однако PEP кажутся менее авторитетными, чем документация (основными частями которой являются ссылки на языки и библиотеки), и существуют многочисленные отклонения от PEP (многие из них упомянуты явно). Поэтому, пока команда не обновит его, я думаю, что более строгим гарантиям PEP нельзя доверять.
ИЗМЕНИТЬ Я сообщил об этом на GH как о проблеме Python
Я нашел удивительное предложение в документации Python в разделе «Тестирование истинности»:
Операции и встроенные функции, имеющие логический результат, всегда возвращают 0 или False в случае ложности и 1 или True в случае истины, если не указано иное.
Похоже, что операторы отношения не имеют исключающих операторов, поэтому IIUC может возвращать 0 и 1 вместо False и True< /code> для значений некоторых встроенных типов (например, 7 < 3), даже недетерминировано.
Таким образом, чтобы удовлетворить спецификации, требующие от моего кода создания значений типа bool или для защитного программирования (когда это важно), следует ли мне заключать логические выражения в вызовы bool ?
Дополнительный вопрос: почему существует такая широта? Облегчает ли это работу CPython или другой реализации?
ИЗМЕНИТЬ На вопрос был дан ответ, и я принял его, но я хотел бы добавить это в PEP 285 — Добавление типа bool. Я нашел следующие утверждения:
[*]Все встроенные операции, которые концептуально возвращают логический результат, будут изменены и теперь будут возвращать False или True вместо 0 или 1; например, сравнения, оператор «не» и такие предикаты, как isinstance(). [*]Все встроенные операции, которые определены для возврата логического результата, будут изменены и теперь будут возвращать False или True вместо 0 или 1. В частности, это влияет на сравнения (=, is, is not, in, not in), унарный оператор not, встроенные функции callable(), hasattr(), isinstance() и issubclass(), метод dict has_key(), строковые и юникодные методы Endwith(), isalnum(), isalpha(), isdigit(), islower(), isspace(), istitle(), isupper() и Beginswith(), методы юникода isdecimal() и isnumeric( ) и атрибут «закрытый» файловых объектов. Предикаты в модуле оператора также изменены, чтобы возвращать логическое значение, включаяoperator.truth(). [*]Единственное, что меняется, — это предпочтительные значения для представления значений истинности при возврате или явном назначении. Раньше этими предпочтительными значениями истинности были 0 и 1; PEP изменяет предпочтительные значения на False и True и изменяет встроенные операции для возврата этих предпочтительных значений.
Однако PEP кажутся менее авторитетными, чем документация (основными частями которой являются ссылки на языки и библиотеки), и существуют многочисленные отклонения от PEP (многие из них упомянуты явно). Поэтому, пока команда не обновит его, я думаю, что более строгим гарантиям PEP нельзя доверять.
ИЗМЕНИТЬ Я сообщил об этом на GH как о проблеме Python