ошибка «bool не поддается подписке» при отсутствии индексации в bool — Python

#python #boolean

#python #boolean

Вопрос:

У меня есть следующая функция:

     def in_loop(i):
        global loop_started
        if i == '[':
            loop_started = True
            return [True, 'loop starting']
        if loop_started:
            if i == ']':
                loop_started = False
                return [True, 'loop over']
            return True
       return False
  

Я полагаю, что это возвращает кортеж, который выглядит как (True, ‘loop over’), когда i равен «]».
Затем я пытаюсь проиндексировать его с помощью

 for index, i in enumerate(code):
    if in_loop(i):
        loop_counter  = 1
        if in_loop(i)[1] == 'loop starting':
            loop_start = index
        if in_loop(i)[1] == 'loop over':
            loops[f'loop{loop_num}'] = {'start': loop_start, 'end': index}
            loop_num  = 1
  

но это вызывает ошибку

 TypeError: 'bool' object is not subscriptable
  

Кроме того, код = » [-][-]».

Почему возникает эта ошибка при индексации в кортеж?

Комментарии:

1. Что происходит, когда i этого ] тоже нет. ( None возвращается)

2. @Kingsley Я думаю, что в этом проблема, на самом деле, я также считаю, что отсутствует фрагмент кода, который возвращает boolean

3. Это работает для меня: if in_loop(']')[1] == 'loop_over': однако, если я не передаю ']' как i , я получаю NoneType object is not subscriptable

4. Когда i нет ], он выполняет другие действия, я просто не включил это, чтобы упростить чтение

5. Проблема в том, что return False / return True когда i не является ни '[' , ни ']'

Ответ №1:

Проблема в том, что при достижении символов типа ‘ ‘ или ‘-‘ вы, по сути, возвращаете логическое значение, но, тем не менее, получаете доступ if in_loop(i)[1] == 'loop starting': .

Вы должны вернуть согласованный возвращаемый тип, чтобы код 2-го цикла for работал. Например, посмотрите на комментарии ниже к вашему коду:

 def in_loop(i):
    global loop_started
    if i == '[':
        loop_started = True
        return [True, 'loop starting']
    if loop_started:
        if i == ']':
            loop_started = False
            return [True, 'loop over']
        return True  #This will have side effects and is inconsistent with your other returns of in_loop
   return False  #This will have side effects and is inconsistent with your other returns of in_loop
  

Ответ №2:

Это имеет место только тогда, когда вы вводите что-то, что не является '[' or ']' , потому что это дошло бы до второго if из if loop_started: , и по умолчанию, если внутреннее условие не выполняется, это было бы просто return True , вот почему это не работает.

Ответ №3:

Как вы инициализировали var loop_started ? (Или, другими словами, какое значение loop_started имеет, когда функция не была выполнена?)

Если loop_started это False перед выполнением функции, то функция будет возвращать False напрямую.

Быстрым исправлением было бы добавление пустой строки после всех логических операторов return.