Python:如何在函数的本地范围内运行 eval()

标签 python scope eval

我尝试在函数的局部范围内使用 eval()。然而它总是在全局范围内评估。

独立的示例:

1-此代码有效:

var1 = 1
var2 = 2
var3 = 3    
myDict = dict((name, eval(name)) for name in ["var1",
                                              "var2",
                                              "var3"])
print(myDict["var1"])

2- 为 lvar1 抛出 NameError

def test1():
   lvar1 = 1
   lvar2 = 2
   lvar3 = 3
   myDict = dict((name, eval(name)) for name in ["lvar1",
                                                 "lvar2",
                                                 "lvar3"])
   print(myDict["lvar1"])

3- 与 2 相同的结果。

def test2():
    lvar1 = 1
    lvar2 = 2
    lvar3 = 3
    myDict = dict((name, eval(name), locals()) for name in ["lvar1",
                                                            "lvar2",
                                                            "lvar3"])
    print(myDict["lvar1"])

最佳答案

保存 locals()(或 vars())调用的结果以返回函数的本地作用域。否则,生成器表达式内的 locals() 将返回 gen-expr 的本地范围。

def test3():
    lvar1 = 1
    lvar2 = 2
    lvar3 = 3
    scope = locals()
    myDict = dict((name, eval(name, scope)) for name in [
                  "lvar1", "lvar2", "lvar3"])
    print(myDict["lvar1"])

顺便说一句,您不需要明确的理解来构建该字典:

# copy() avoids quirky, unexpected updates if something else (like a debugger)
# accesses locals() or f_locals
myDict = locals().copy()  # or vars().copy()

关于Python:如何在函数的本地范围内运行 eval(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36616739/

相关文章:

java - 套接字在将 json 对象从 Java 传输到 Python 时被阻塞

python - Django 模板 : Use different css for pages

python - 尝试使用 django-embed-video 将 youtube 视频列表显示到 django 模板中

python - 如何捕获长时间运行的程序的输出并将其呈现在 Python 的 GUI 中?

python - 在 python 中使用 compile 和 eval 时出现奇怪的问题

c++ - 在 C++ 的方法内部创建的对象实例的持久性

javascript - Node REPL : Why does this variable assignment fail?

azure - 如果具有 DeployIfNotExist 效果的 Azure Policy 的范围是资源组,它是否能够部署资源?

javascript - 如何使用字符串在 popcorn.js 中选择轨道并播放?

python - 如何以字符串格式编写多行函数?