Python IndentationError:缩进级别太多

时间:2011-12-09 00:21:21

标签: python

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

  

IndentationError:缩进级别太多

我已经读过这是python解释器的低级别定义的一些限制,是否有人知道如何为它找到解决方法?一些解释器参数可以正常,我发现唯一的solution proposal建议重新编译Python以便为MAXINDENT常量设置不同的值,这不是我梦寐以求的。< / p>

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

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

编辑2 :现在我已经完成了一些重构,我的树存储为字典:文件的加载会产生新的错误:

  

s_push:解析器堆栈溢出
  的MemoryError

我再次找到了一个建议some tweaks of the interpreter's headers的资源。


4 个答案:

答案 0 :(得分:3)

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

使用函数,字典调度以及可能发生的任何其他事情来减少深度。

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

答案 1 :(得分:2)

你可以拥有动态生成的深层嵌套结构,例如,~100个嵌套级别列表导致s_push: parser stack overflow作为字符串文字,但如果你从json-text,example动态创建它,它就可以工作:

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 :(得分: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 :(得分:0)

解决方法 - 将您分成多个功能?