exec()在函数错误中的列表解析中嵌套循环

时间:2017-08-20 13:18:31

标签: python function exec list-comprehension python-2.x

来自函数内部的

exec()给出了不同的输出,即使我传递了该函数所需的所有参数。请考虑以下代码:

def list_filter(expr,datalist,includelist) :
    exec(expr)
    print outlist


datalist=['try to kill me','black image']
includelist=['me']
expr="outlist = [i for i in datalist if  all(j in i for j in includelist)  ]"
exec(expr)
print outlist
list_filter(expr,datalist,includelist)

我在这里检查了类似的案例:How does exec work with locals?

但这是一个不同的错误,我使用版本2.7.13并且我在一般条件下检查,exec()通常没有任何错误。我发现当出现“嵌套循环”时会出现此问题。内部列表理解语句,例如使用all()any()。在这种情况下,如果我从列表推导中删除if condition(使其成为expr = "outlist = [i for i in datalist ]"),那么我将像往常一样获得正确的输出。

知道为什么吗?

1 个答案:

答案 0 :(得分:0)

在这种情况下使用exec几乎总是一个坏主意,你根本不应该使用它。

但是,因为你问:如果从本地范围传入变量,它可以正常工作:

def list_filter(expr, datalist, includelist):
    exec(expr, locals())
    print outlist

我对exec的范围规则不是很熟悉,但我经常发现你需要明确地传递变量(特别是如果exec不在全局范围内)。

在你的情况下,你甚至可以明确地传递它们:

def list_filter(expr, datalist, includelist):
    exec(expr, {'datalist': datalist, 'includelist': includelist})
    print outlist

甚至在documentation中说明您可能需要将变量从范围传递到exec

  

内置函数globals()locals()分别返回当前的全局和本地字典,这可能对传递给exec使用很有用。