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

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)

如您所见,我定义了两个函数:bar&foo,并使用结果调用了这两个函数:

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

推荐答案

docs人开始:

如果exec得到两个单独的对象globalslocals,代码将被执行,就像它嵌入到类定义中一样.

这不是你想要的,所以不要提供locals分.

glo = {}
exec(bytecode, glo)

输出,供参考:

before all a=1
bye n='just works'
hello n='sara'
bye n='sara'

Python相关问答推荐

在pandas/python中计数嵌套类别

人口全部乱序 - Python—Matplotlib—映射

比Pandas 更好的 Select

如何在Gekko中使用分层条件约束

应用指定的规则构建数组

使用SQLAlchemy从多线程Python应用程序在postgr中插入多行的最佳方法是什么?'

如何在Polars中将列表中的新列添加到现有的数据帧中?

如何在基于时间的数据帧中添加计算值

按最大属性值Django对对象进行排序

更新包含整数范围的列表中的第一个元素

跨两个数据帧收集非索引列上的公共组

如何让doctest在mkdocs的标记代码块中运行示例?

Pandas dataframe中str.place()的奇怪行为.删除与目标字符串不匹配的值

使用Mysql Connector通过Python创建Mysql Storec过程

在Pandas 数据框中,可以有一些多索引列和一些单索引列吗?

对每列给定行进行块切片

在给定一组约束的情况下使用所有唯一组合创建数据帧

获取以极轴表示的最小/最大列名

窗口必须是整数0或更大,&q;与';30D';样式滚动计算有关

Pandas 多列数据帧的重采样和内插