Python 缩进错误:缩进级别过多
我有一部分Python程序是自动生成的,生成的代码里面有很多嵌套的if
和else
语句。我的问题是,这样嵌套太多了,运行代码时出现了这个错误:
IndentationError: too many levels of indentation
我看到有人说这是Python解释器底层定义的一个限制,有没有人知道我该怎么解决这个问题?如果能调整一些解释器的参数就好了。我找到的唯一一个解决方案建议重新编译Python,以设置MAXINDENT
常量的不同值,但这可不是我想要的。
编辑:我的代码是很多嵌套的if...else
,虽然看起来很乱,但这是我找到的最快的方法来把一个复杂的决策树移植到Python。我知道这样写很乱;这段代码不是我自己写的——我甚至没打算去修改它(我更想改改生成代码的工具)。
我知道可以用其他方式来建模这个决策树。我想要的解决方案要简单得多,比如如果可能的话,调整一下解释器。
编辑 2:现在我做了一些重构,我把树存储为一个字典:加载文件时又出现了一个新错误:
s_push: parser stack overflow
MemoryError
这次我又找到了一些资源,建议调整解释器的头文件。
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()
你的生成器产生了糟糕的代码。你应该把这个问题看得和它产生语法错误的代码一样严重。
可以使用函数、字典调度以及其他任何你想到的方法来减少代码的复杂程度。
另一方面,感谢你让我知道Python确实有最大深度限制。我之前不知道这一点。:)
你可以有非常复杂的嵌套结构,比如说有大约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