ошибка "bool is subscriptable", когда не выполняется индексация в bool - Python - PullRequest
3 голосов
/ 27 марта 2019

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

    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'), когда я равен "]". Затем я пытаюсь внести в него индекс

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

Кроме того, code = "+++++ [-] [-]".

Почему эта ошибка возникает, когда я индексирую в кортеж?

Ответы [ 3 ]

1 голос
/ 27 марта 2019

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

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

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
1 голос
/ 27 марта 2019

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

0 голосов
/ 27 марта 2019

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

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

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

...