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
相关产品推荐
相关产品推荐

