如何在函数的本地范围内运行 eval()
- 2025-03-26 09:10:00
- admin 原创
- 11
问题描述:
我尝试在函数的局部范围内使用 eval()。但是它总是在全局范围内进行求值。
自包含示例:
1-此代码有效:
var1 = 1
var2 = 2
var3 = 3
myDict = dict((name, eval(name)) for name in ["var1",
"var2",
"var3"])
print(myDict["var1"])
2-NameError
投掷lvar1
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"])
解决方案 1:
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()
解决方案 2:
首先,阅读以下内容很重要:
表达式参数被解析并评估为 Python 表达式(从技术上讲,是条件列表),使用全局和本地字典作为全局和本地命名空间。如果存在全局字典但缺少
‘__builtins__’
,则在解析表达式之前将当前全局变量复制到全局变量中。这意味着表达式通常具有对标准__builtin__
模块的完全访问权限,并且会传播受限环境。如果省略了本地字典,则默认为全局字典。如果省略了两个字典,则表达式将在调用的环境中执行
eval()
。返回值是评估表达式的结果。
首先,需要注意的是,生成器表达式有自己的范围(对于字典理解也是如此),因此它有自己的locals()
字典。
这是有效的,因为在全局范围内
globals()
和locals()
dict 都指向同一个字典,因此 dict 构造函数可以访问这些变量。这里我们再次
eval()
使用 noglobals()
和locals()
dict 进行调用,因此它最终使用全局范围和它自己的本地范围(为空),并且在任何这些范围中都没有可用的变量。请记住,生成器有自己的范围,因此
locals()
在这里调用几乎没有任何区别,这是一个空的字典。
解决方案:
def test1():
lvar1 = 1
lvar2 = 2
lvar3 = 3
test1_locals = locals()
myDict = dict((name, eval(name, test1_locals)) for name in ["lvar1",
"lvar2",
"lvar3"])
print myDict
print(myDict["lvar1"])
这是有效的,因为我们在变量中捕获了 test1 locals()
,然后在字典理解中使用该字典,因此它现在可以访问这些变量。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD