Python IndentationError:太多的缩进级别



我已经生成了我的python程序的一部分,生成的代码包含了很多嵌套的if/else,我的问题是很多可以太多,我得到了这个错误时运行我的代码:

IndentationError: too many levels of缩进

我读到这是在python解释器的低水平上定义的一些限制,有人知道我如何找到一个解决方案吗?一些解释器参数会很好,我发现的唯一解决方案建议重新编译Python,以便为MAXINDENT常数设置不同的值,这不是我梦寐以求的。

EDIT:代码是一大堆嵌套的if...else,它很脏,但它是我发现将复杂的决策树移植到Python的最快方法。我知道它有多脏;这不是我自己写的——我甚至不打算编辑它(我宁愿触摸生成器)。

我知道我可以用其他的方式来模拟这个决策树。我想要的是一种比这更简单的方法,比如在可能的情况下调整解释器。

EDIT 2:现在我已经做了一些重构,并且我的树被存储为字典:文件的加载给出了一个新的错误:

s_push:解析器栈溢出
MemoryError

在这里,我又发现了一个资源建议对解释器的头文件进行一些调整。


您的生成器正在生成错误的代码。您应该像处理生成语法上无效的代码一样处理它。

使用函数,字典调度和任何其他可能出现的东西来减少深度。

OTOH,谢谢你告诉我Python确实有一个最大深度。我不知道。:)

你可以有深度嵌套的结构,动态生成,例如,~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

对于@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()

最新更新