Eval 只有在我在调用之外定义范围时才有效

Eval only works if I define scope outside of the call

我有以下简化代码:

scope = locals()
for batch in stream:
     for row in batch.results:
          writer.writerow([eval(pf, scope) for pf in process_fields])

它把row对象(GoogleAdsRow对象)的不同字段的内容保存在一个csv

它工作正常,但如果我不使用 scope 变量,而是直接使用 locals() 函数,它会失败:

for batch in stream:
     for row in batch.results:
          writer.writerow([eval(pf, locals()) for pf in process_fields])

它returns:

NameError: name 'account' is not defined 其中 accountprocess_fields 之一。 所以我假设这是因为 eval 函数没有找到变量,但我不明白为什么这么小的变化会造成这个问题。

变化不小。在您显示的代码中,有 两个 范围:

  1. 无论循环在什么范围内。
  2. 列表理解创建的范围。

在您的第一个示例中,您在第一个范围内调用 locals

在您的第二个示例中,您在第二个范围内调用 locals