#2782·smolagents

本地 Python 执行器忽略循环 else 子句 (for...else / while...else)

作者: AnishPatel526创建于 2026年9月10日更新于 2026年9月15日

描述错误 smolagents.local_python_executor 忽略了 forwhile 循环的 else 子句。在 Python 中,循环的 else 部分在循环正常结束时运行(即迭代器耗尽或 while 条件变为假),只有在通过 break 退出循环时才会跳过。解释器的 evaluate_forevaluate_while 从不查看循环的 orelse 部分,因此 else 部分永远不会被执行。 由于执行器是运行 CodeAgent 生成的代码的地方,编写了完全有效的 for/elsewhile/else(这是搜索循环的常见习惯)的代理将获得一个默默无声的错误结果,没有任何错误。 ### 重现 从 smolagents.local_python_executor 导入 evaluate_python_code 和 BASE_PYTHON_TOOLS。 代码为: x = 0 for i in range(3): x += i else: x += 100 x 结果和 _ 为 evaluate_python_code(code, static_tools=dict(BASE_PYTHON_TOOLS), state={})。 打印结果(打印 3 - CPython 打印 103) 与 while ... else 相同。 相反,当循环被 break 退出时,必须跳过 else 部分(CPython 行为),而当前代码也无法表达这一点,因为它在没有区分两种情况的情况下返回/退出。 ### 预期行为 匹配 CPython: - 循环正常完成(没有 break) → 运行 else 部分。 - 循环通过 break 退出 → 跳过 else 部分。 - continue 不影响 else 是否运行。 ### 建议修复 在 evaluate_forevaluate_while 中跟踪是否发生了 break,并在没有发生的情况下执行循环的 orelse 部分。我很乐意发送一个带有回归测试的小 PR。

内容来源: huggingface/smolagents