Python 缩进错误:缩进级别过多

9 投票
3 回答
3069 浏览
提问于 2025-04-17 08:01

我有一部分Python程序是自动生成的,生成的代码里面有很多嵌套的ifelse语句。我的问题是,这样嵌套太多了,运行代码时出现了这个错误:

IndentationError: too many levels of indentation

我看到有人说这是Python解释器底层定义的一个限制,有没有人知道我该怎么解决这个问题?如果能调整一些解释器的参数就好了。我找到的唯一一个解决方案建议重新编译Python,以设置MAXINDENT常量的不同值,但这可不是我想要的。

编辑:我的代码是很多嵌套的if...else,虽然看起来很乱,但这是我找到的最快的方法来把一个复杂的决策树移植到Python。我知道这样写很乱;这段代码不是我自己写的——我甚至没打算去修改它(我更想改改生成代码的工具)。

我知道可以用其他方式来建模这个决策树。我想要的解决方案要简单得多,比如如果可能的话,调整一下解释器。

编辑 2:现在我做了一些重构,我把树存储为一个字典:加载文件时又出现了一个新错误:

s_push: parser stack overflow
MemoryError

这次我又找到了一些资源,建议调整解释器的头文件


3 个回答

1

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

你的生成器产生了糟糕的代码。你应该把这个问题看得和它产生语法错误的代码一样严重。

可以使用函数、字典调度以及其他任何你想到的方法来减少代码的复杂程度。

另一方面,感谢你让我知道Python确实有最大深度限制。我之前不知道这一点。:)

2

你可以有非常复杂的嵌套结构,比如说有大约100层的列表,这样会导致出现 s_push: parser stack overflow 的错误,尤其是当你把它作为字符串直接写出来的时候。不过,如果你是从json文本动态生成这个结构,那就没问题了。这里有个例子

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

撰写回答