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
其中 account
是 process_fields
之一。
所以我假设这是因为 eval
函数没有找到变量,但我不明白为什么这么小的变化会造成这个问题。
变化不小。在您显示的代码中,有 两个 范围:
- 无论循环在什么范围内。
- 列表理解创建的范围。
在您的第一个示例中,您在第一个范围内调用 locals
。
在您的第二个示例中,您在第二个范围内调用 locals
。
我有以下简化代码:
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
其中 account
是 process_fields
之一。
所以我假设这是因为 eval
函数没有找到变量,但我不明白为什么这么小的变化会造成这个问题。
变化不小。在您显示的代码中,有 两个 范围:
- 无论循环在什么范围内。
- 列表理解创建的范围。
在您的第一个示例中,您在第一个范围内调用 locals
。
在您的第二个示例中,您在第二个范围内调用 locals
。