我生成的python程序的一部分,生成的代码包含很多嵌套if
/ else
,我的问题是很多可能太多了我得到了这个运行我的代码时出错:
IndentationError:缩进级别太多
我已经读过这是python解释器的低级别定义的一些限制,是否有人知道如何为它找到解决方法?一些解释器参数可以正常,我发现唯一的solution proposal建议重新编译Python以便为MAXINDENT
常量设置不同的值,这不是我梦寐以求的。< / p>
编辑:代码是一大堆嵌套的if...else
,它很脏但是我发现将复杂的决策树移植到Python是最快的。我知道它有多脏;我自己没有写它 - 我甚至没有计划编辑它(我宁愿触摸发生器)。
我知道我可以用其他方式对这个决策树进行建模。我想要的是一种比这更简单的方法,比如在可能的情况下调整解释器。
编辑2 :现在我已经完成了一些重构,我的树存储为字典:文件的加载会产生新的错误:
s_push:解析器堆栈溢出
的MemoryError
我再次找到了一个建议some tweaks of the interpreter's headers的资源。
答案 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)
解决方法 - 将您分成多个功能?