gpt4 book ai didi

Python:Eval 在函数中给出 NameError

转载 作者:太空宇宙 更新时间:2023-11-03 21:16:27 24 4
gpt4 key购买 nike

我想使用 eval 进行运算,看看 ab 是否等于 c 以及某个运算符.

我的代码:

def Expression(a, b, c):
operators = ["+", "-", "*", "/"]
return len([i for i in operators if eval("a () b".replace("()", i)) == c]) >= 1

Expression(1, 2, 3)

由于某种原因,这会导致名称错误。错误日志:

return len([i for i in operators if eval("a () b".replace("()", i)) == c]) >= 1
File "<string>", line 1, in <module>
NameError: name 'a' is not defined

由于该函数有 a 作为参数,我不认为 a 应该是未定义的。这里有什么问题吗?

最佳答案

问题是在这种情况下eval尝试在全局范围内找到ab,而不是函数scop(这意味着 >ab 仅在功能 block 中有效)。因此您可以使用 locals() 将函数当前作用域传递给 eval,如下所示:

def Expression(a, b, c):
operators = ["+", "-", "*", "/"]
scope = locals()
return len([i for i in operators if eval("a () b".replace("()", i), scope) == c]) >= 1

然后你的代码就可以工作了。

为了更好地理解,尝试在全局范围内定义 ab,然后你可以看到它的工作原理,如下所示:

a=1
b=2
def Expression(c):
operators = ["+", "-", "*", "/"]
return len([i for i in operators if eval("a () b".replace("()", i)) == c]) >= 1
Expression(3)

此外,您可以通过创建字典并将其传递给 eval 来将自定义范围传递给 eval:

scope = {'a':a, 'b':b}

所以,这是你的代码问题。但为了更好的态度,你可以使用 @Rakesh 之前所说的,使用格式化字符串,它获取当前的 ab 并将其传递给 eval 作为它们内部的内容,像这样:

eval(f"{a}{i}{b}") # <Python3.6 
eval("{}{}{}".format(a,i,b))

您也可以使用any()而不是 len() >= 1

关于Python:Eval 在函数中给出 NameError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54670266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com