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

2024-09-26 22:50:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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)

结果是:
执行者1(abc==123):真
executor2(abc==123):错误

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

这里还有另一个代码:

^{pr2}$

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

这是怎么发生的?在

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


Tags: 代码getreturncompilerdefcontextscriptcode
2条回答

对于第一个问题,compile只接受python代码并生成字节码。它不依赖于编译它的闭包。如果你拿出一根绳子,那就没什么不同了。该字符串不是永久绑定到创建它的函数上,代码对象也不是。在

对于第二个问题,locals()在调用时会生成一个局部变量字典。因为您在调用locals之后设置了test_var,所以它没有它。如果您想在本地函数内部测试_var,则需要在以后调用它。在

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

在您的第二个例子中,您发现了一个有趣的情况,解释程序从上下文中删除了test_var,因为test_var没有被引用。在

相关问题 更多 >

    热门问题