bool(input()) всегда возвращает True

Рейтинг: 0Ответов: 1Опубликовано: 07.04.2023

Работал над заданием и возникла ошибка. Не смотря на то что я ввожу в is_good_employee всегда возвращается True (Это можно увидеть на скрине в меню отладки).

worker = is_good_employee= True

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

workers = []


class Employee:
    def __init__(self, name, on_vacation, salary, is_good_employee):
        self.name = name
        self.on_vacation = on_vacation
        self.salary = salary
        self.is_good_employee = is_good_employee
    
    def info(self):
        print(f"работник {self.name} получает {self.salary} и находится {self.on_vacation}. ")


for i in range(0, 5):
    worker = Employee(name=input("Имя сотрудника >>> "), salary=input("Заработная плата >>> "),
                      on_vacation=input("Работа >>> "), is_good_employee=bool(input()))
    
    if not worker.is_good_employee:
        workers.append("Уволен")
    else:
        workers.append(worker.name)

    print(workers)

Ответы

▲ 6Принят

В отличие от int, float и других похожих функций, bool не конвертирует строки "True" или "False" в булевые значения True или False соответственно, а проверяет любой переданный объект на "истинность".

В частности, bool от любой непустой коллекции вернет True, от пустой - False. Поэтому в случае строк он вернет False только для пустой строки:

>>> bool("sdfwt")
True

>>> bool("False")
True

>>> bool("")
False

Если нужно чтобы "True" преобразовывалось в True, можно просто сравнивать введенную строку со строкой "True":

is_good_employee = input() == "True"

Я бы еще сделал, чтобы проверка была без учета регистра:

is_good_employee = input().casefold() == "true"

тогда будет срабатывать и на "True", и на "true", и на "tRuE".

Документация:

  • bool
  • Truth Value Testing - как определяется, что объект "истинный" или "ложный" при передаче в bool или при использовании объекта в качестве условий в if или while.