gpt4 book ai didi

python - 为什么我不能使用 exec 从另一个函数调用一个函数

转载 作者:行者123 更新时间:2023-12-05 05:32:57 25 4
gpt4 key购买 nike

比如说,我有一段非常简单的代码

py = """
a = 1
print (f'before all {a=}')

def bar(n):
print(f'bye {n=}')

def foo(n):
print(f'hello {n=}')
bar(n)

bar ('just works')
foo ('sara')
"""

loc = {}
glo = {}
bytecode = compile(py, "script", "exec")
exec(bytecode, glo, loc)

如您所见,我定义了两个函数:barfoo 并调用了这两个函数并返回了结果:

before all a=1
bye n='just works'
hello n='sara'
Traceback (most recent call last):
File "/home/bla-bla/pythonProject/main_deco2.py", line 43, in <module>
exec(bytecode, glo, loc)
File "script", line 13, in <module>
File "script", line 10, in foo
NameError: name 'bar' is not defined

这让我感到困惑,因为我不明白为什么函数 foo 看不到 bar 而就在一秒钟前我能够调用 bar 没有问题吗?

最佳答案

一个重要的诊断:

>>> dis.dis(bytecode)
2 0 LOAD_CONST 0 (1)
2 STORE_NAME 0 (a)

3 4 LOAD_NAME 1 (print)
6 LOAD_CONST 1 ('before all a=')
8 LOAD_NAME 0 (a)
10 FORMAT_VALUE 2 (repr)
12 BUILD_STRING 2
14 CALL_FUNCTION 1
16 POP_TOP

我省略了大部分结果,但前几行显示了正在发生的事情。访问 abar 使用 LOAD_NAMESTORE_NAME 操作码,use the locals first . (它不能使用 LOAD_FAST,因为它不是编译函数。)要解决这个问题,只需将必要的名称显式标记为 global

不幸的是,我没有很好的答案来解释它为什么这样做。

关于python - 为什么我不能使用 exec 从另一个函数调用一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73940751/

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