Python IndentationError: слишком много уровней отступа

У меня есть часть моей программы python, которая сгенерирована, сгенерированные коды содержат много вложенных if/else, моя проблема в том, что много может быть слишком много, и я получил эту ошибку при запуске моего код:

IndentationError: слишком много уровней отступа

Я читал, что это было некоторое ограничение, определенное на низком уровне интерпретатора python, кто-нибудь знает, как я могу найти обходное решение для него? Некоторые параметры интерпретатора были бы точными, единственное решение, которое я нашел, предлагает перекомпилировать Python, чтобы установить другое значение для MAXINDENT постоянный, что не совсем то, о чем я мечтаю.

EDIT: код представляет собой большую группу вложенных if...else, он грязный, но быстрее всего я обнаружил, что Python представляет собой сложное дерево решений. Я знаю, насколько это грязно; Я сам его не писал - я даже не планировал его редактировать (я бы скорее прикоснулся к генератору).

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

EDIT 2: теперь я сделал несколько рефакторингов, и мое дерево хранится как словарь: при загрузке файла появляется новая ошибка:

s_push: переполнение стека парсеров
MemoryError

Здесь снова я нашел ресурс, предлагающий некоторые настройки заголовков интерпретатора.


Ответ 1

У вас могут быть глубоко вложенные структуры, которые генерируются динамически, например, ~ 100 списков вложенных уровней приводит к s_push: parser stack overflow как строковый литерал, но он работает, если вы создаете его динамически из json-text, пример:

import ast
import json

N = 100
s = "["*N + "123" +"]"*N

L1 = json.loads(s)
def flatten(L):
    for el in L:
        try:
            for item in flatten(el):
                yield item
        except TypeError:
            yield el
assert next(flatten(L1)) == 123
print("json ok")

L2 = ast.literal_eval(s) # raises MemoryError

Ответ 2

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

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

OTOH, спасибо, что показал, что Python действительно имеет максимальную глубину. Я этого не знал.:)

Ответ 3

Как и для ответа @warvariuc, лучше всего было бы разделить ваши последовательности if-else на несколько функций - одну функцию для каждой последовательности "if-elif-else" с автогенерированным сгенерированным именем.

Python должен будет разбирать все функции, чтобы он мог вызвать его в произвольном порядке, поэтому внешняя пара "if-else" также должна быть помещена в функцию, которая будет вызываться в конце файла.

Другими словами, сгенерированный код, который у вас есть, выглядит следующим образом:

if bla:
    if ble:
        #bla
    else:
        #bli
elif ble:
    #bli

должен быть сгенерирован таким образом:

def main(state):
    if bla:
        main_1(state)
    elif ble:
        #bli

def main_1(state):
    if ble:
        #bla
    else:
        #bli

main()

Ответ 4

Обходной путь - разделение на функции?