You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3.7中替代goto实现循环内条件回退重跑的方法

实现方案

运行环境:Python 3.7
你要的「操作不满足校验就回滚重试」逻辑不需要依赖goto语法,Python里用基础的循环控制就能实现,逻辑比goto更清晰可控。

核心实现代码

直接用while循环做重试控制,完全匹配你的业务流程:

for obj in group_obj.objects:
    bpy.ops.ed.undo_push()
    # 重试循环:直到对象放置合法才跳出
    while True:
        move_rotate(obj, T, T_0)
        if check_if_cross_wall(obj):
            # 穿墙则撤销操作,回到循环起点重新执行移动旋转
            bpy.ops.ed.undo()
            continue
        # 校验通过,退出重试
        break
    count += 1
    accessableArea(obj)

逻辑说明

  • 循环内的continue语句就对应你想要的「跳转回操作起始位置」效果:只要校验不通过,执行完撤销后就会立刻回到move_rotate的调用位置重新执行
  • 校验通过后执行break退出重试循环,自动进入后续的计数、可达区域计算流程,和你预期的正常分支完全一致

防死循环优化

如果你的move_rotate是带随机参数的,极端情况可能出现反复穿墙触发无限循环,可以给重试加最大次数限制:

# 单对象最大重试次数
MAX_RETRY = 50
for obj in group_obj.objects:
    bpy.ops.ed.undo_push()
    retry_times = 0
    place_success = False
    while retry_times < MAX_RETRY:
        move_rotate(obj, T, T_0)
        if check_if_cross_wall(obj):
            bpy.ops.ed.undo()
            retry_times += 1
            continue
        place_success = True
        break
    # 重试次数耗尽仍不合法的处理:比如跳过当前对象、打印告警
    if not place_success:
        continue
    count += 1
    accessableArea(obj)

不要用网上流传的第三方goto库,这类库大多是实验性质,对Python3.7的兼容性参差不齐,还会大幅降低代码可维护性,用原生循环实现是兼容性、可读性最好的方案。


内容的提问来源于stack exchange,提问作者P. Scotty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:48:16