И как типы реагируют на это

Логический поток фрагмента кода можно представить в виде ветвей дерева. Условные обозначения помогают разработчикам охватить определенные ситуации, и в целом они добавляют новые ответвления в виде функций и проверок.

Булевы значения придают смысл структурам данных. Любое число или строка сами по себе не являются правильными или неправильными, пока мы не сравним их с нашими правилами и ожиданиями.

Если моя чашка пуста, я налью еще кофе; но если мне не хватает кофе, мне нужно пойти в магазин. Если это воскресенье, магазин будет закрыт, а без кофе мне будет грустно.

Люди уже основывают большинство своих процедур и взаимодействий на неявно применяемом наборе правил для ценностей и состояния. Например, я не могу приготовить больше кофе, если у меня меньше 7 зерен, и если состояние чашки Emptyя наполню ее.

Однако Python присваивает объектам значение True, даже не создавая условного выражения. В этом посте мы рассмотрим определения, лежащие в основе значений Truth, как работать с ними и избегать неприятных ошибок, а также как настраивать Truth пользовательских классов.

Правда и ложь

Объекты Python содержат представление True или False в зависимости от их значения или состояния. По умолчанию все значения равны True минус определенный набор.

Обратите внимание, как мы можем напрямую привести любой тип к bool. Если результат равен True, мы говорим, что значение истинно или ложно в противном случае. Доступ к истинности значений позволяет нам использовать их напрямую в условных или логических операциях без добавления каких-либо сравнений.

Теперь, как эта логика запрограммирована в Python? Если вы еще никогда этого не делали, я бы порекомендовал повеселиться, почитав help некоторых стандартных типов, таких как str или int. Если мы проанализируем эти два, мы натолкнемся на пару интересных определений:

Обратите внимание, что значения int равны True, если они отличаются от 0, и все str равны True, если их длина отлична от 0, даже если __bool__ не реализовано. Если мы посмотрим на документы Python для object, мы увидим объяснение этого поведения:

object.__bool__(я)

Вызывается для реализации проверки истинности и встроенной операции bool(); должен вернуть False или True. Когда этот метод не определен, вызывается __len__(), если он определен, и объект считается истинным, если его результат не равен нулю. Если класс не определяет ни __len__(), ни __bool__(), все его экземпляры считаются истинными.

Имея под рукой это определение, мы можем быстро расширить ответ для любой последовательности или объекта итератора и даже применить его к нашим пользовательским классам.

Отметьте «Нет», когда вы имеете в виду это

В приведенном выше примере мы исключили один уникальный объект — None. С добавлением подсказок типа игра с Optionals очень помогает при чтении кода и имеет четкое управление исключениями для отсутствующих значений.

Однако, если мы не будем внимательны при проверке этого конкретного условия, мы можем скрыть некоторые проблемы, которые трудно отладить. Иметь отсутствующее значение None не то же самое, что иметь значение, истинное значение которого равно False.

Поскольку значение bool для None равно False, первый сценарий поймает отсутствующие count и count == 0. В то время как второй будет выполняться только явно для None.

Здесь нет хорошего или неправильного, но вы должны учитывать, что имеет смысл для вашей бизнес-логики.

Игра с правдой

Знание того, как Python присваивает своим типам True или False, позволяет нам воспроизвести поведение в наших классах, что может пригодиться, чтобы сделать код более простым и выразительным.

С относительно простым определением, где мы повторно используем значение Истинности целого числа, мы можем легко идентифицировать пустые чашки кофе.

Логические операторы

Кроме того, понимание правдивостизначений открывает замечательную возможность использования логических операторов. Их можно применять не только для условий if и while, но и для определения новых переменных на основе истинности существующих объектов. Мы собираемся сделать это на основе этого фрагмента документации:

Обратите внимание, как мы можем применять операторы or и and для получения интересных результатов, особенно с точки зрения вычисления выражений. В зависимости от истинности первого аргумента второй может быть оценен или не оценен. Это называется сокращением, которое позволяет нам откладывать определенные выполнения только тогда, когда это необходимо или когда необходимо выполнить определенные условия.

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

Сокращая условное выражение, get_funds() будет (безопасно) выполняться только в том случае, если пароль будет правильно сообщен. В противном случае функция не будет вычислена, так как результирующее логическое выражение уже равно False.

Заключение

Гибкость Python иногда может иметь свою цену. Например, разработчики, не знающие о конкретном поведении, могут затенить реальную логику программы небольшими деталями реализации. Лечение? Любопытство и испытания.

В этом посте мы увидели, как Python преобразует объекты в bool, что может быть мощным инструментом в условных и логических операциях. Мы также применили эти определения к пользовательскому классу, учась обращать внимание на детали логики.

Короче говоря, это был еще один пример того, как Дзен Python продолжает быть правильным: Явное лучше, чем неявное. Проверьте на None, когда вы это имеете в виду!