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
Обходной путь - разделение на функции?