gpt4 book ai didi

python - python 中的compile() 是如何工作的?

转载 作者:行者123 更新时间:2023-12-01 06:06:58 24 4
gpt4 key购买 nike

我有两个代码让我很困惑。

def get_context():
__gc = globals()
__lc = locals()

def precompiler(code):
exec code in __lc

def compiler(script, scope):
return compile(script, scope, 'eval')

def executor(expr):
return eval(expr, __gc, __lc)

return precompiler, compiler, executor

maker1, compiler1, executor1 = get_context()
maker2, compiler2, executor2 = get_context()

maker1("abc = 123")
maker2("abc = 345")
expr1 = compiler1("abc == 123", "test.py")
print "executor1(abc == 123):", executor1(expr1)
print "executor2(abc == 123):", executor2(expr1)

结果是:
executor1(abc == 123): True
executor2(abc == 123): False

为什么编译只在闭包中执行一次而字节码可以在两者中运行?

这里还有另一个代码:

def get_context():
__gc = globals()
__lc = locals()

test_var = 123

def compiler(script, scope):
return compile(script, scope, 'eval')

def executor(expr):
return eval(expr, __gc, __lc)

return compiler, executor


compiler1, executor1 = get_context()
compiler2, executor2 = get_context()

expr1 = compiler1("test_var == 123", "test.py")
print "executor1(test_var == 123):", executor1(expr1)
print "executor2(test_var == 123):", executor2(expr1)

结果是:
NameError:名称“test_var”未定义

这是怎么发生的?

为什么编译需要检查闭包的环境(变量或其他),而不依赖于闭包?这就是我困惑的地方!

最佳答案

在第一个示例中,您在第一个上下文中执行“abc=123”,在第二个上下文中执行“abc=345”。因此,“test_var==123”在第一个上下文中为 true,在第二个上下文中为 false。

在第二个示例中,您遇到了一个有趣的情况,解释器已从上下文中删除 test_var,因为 test_var 未被引用。

关于python - python 中的compile() 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7564005/

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