<p>如果我正确地理解了您的问题描述,您希望重复循环<strong>body</strong>(在某些情况下),而不是“迭代”。如果是这样,一种可行的方法是将循环体变成一个可能的递归函数,如果循环要中断,则返回<code>True</code>,如果要继续,则返回{<cd2>},以及可能的标题。例如,一个最直接(虽然可能不是最优雅的)函数:</p>
<pre><code>def body(line):
global title_flag
# skip over comments
if line[0] == '#':
return None, False
# skip over blank lines
if re.search(r'^\s+$', line):
return None, False
# Find the line where the title is defined
if 'DEFINE_MENU' in line and title_flag == 0:
type, name = line.split()
title = name
title_flag = 1
return title, body(line)
# If DEFINE_MENU is found and flag has been raised, this
# signifies a new menu definition.
if 'DEFINE_MENU' in line and title_flag == 1:
return None, True
</code></pre>
<p>主线代码变成:</p>
^{pr2}$
<p>顺便说一句:do<strong>not</strong>通过使用内置名称来命名自己的变量,比如<code>file</code>这是一个单独的主题;-)。BTW2:我使用<code>with</code>(假设Python2.6或更高版本,或者2.5和“import from the future”)只是因为这是打开和关闭文件的正确方法;-)。BTW3:我删除了<code>re.search</code>,因为当一个简单的<code>in</code>操作符显然做了相同的工作时,它是肆意的,令人费解的过度杀戮。在</p>
<p>我发布这段代码主要是为了以一种具体的方式来检查我是否理解你的规范,因为,从行为角度来说,这绝对是一种过激行为,没有必要(从你发布的代码)重复检查注释和空行,也没有搜索<code>'DEFINE_MENU"</code>,等等。。。您可以在设置了标题后立即退出(然后<code>body</code>可能会再次成为内联代码)。在</p>
<p>但是,我想你发帖是有原因的,也就是说,这个简单的行为(而且可以更简单地说)对你来说不是最理想的,也许通过看到你的字面问题的解决方案,你可以指出你想要的不同于此,然后我们可以帮助你。在</p>