我已经生成了我的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()