gpt4 book ai didi

即使存在于 locals() 中,python 函数也未定义

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

import inspect
from functools import wraps

def add_value_checks(*settings):
def wrapping_function(func):
@wraps(func)
def wrapper(*args, **kwargs):
code = inspect.getsource(func)
hoax_code = code[code.find('\n')+1:code.find(':')+2]
hoax_code += '\treturn inspect.currentframe()\n'
if func.__name__ == 'run':
hoax_code = hoax_code.replace('run', 'run_hoax', 1)
print(hoax_code)
exec(hoax_code)
print(locals())
frame = run_hoax(*args, **kwargs)
targs, Args, Kwargs, values = inspect.getargvalues(frame)
for i in targs:
print(" %s = %s" % (i, values[i]))

return wrapper
return wrapping_function

@add_value_checks()
def run(a, b, c=True, d=5):
print("Hello World")

if __name__ == '__main__':
run(3,4)

我看到函数 run_hoax() 存在于 locals() 中,但我仍然得到 NameError: name 'run_hoax' is not Defined。可能的原因是什么?

诸如此类的简单示例效果很好:

In [1]: code = "def fun():\n\tprint(3)"

In [2]: exec(code)

In [3]: fun()
3

我不明白这里出了什么问题。

最佳答案

当您将其放入函数中时,您发布的示例将停止工作:

In [4]: def f():
...: code = "def foo():\n\treturn 1"
...: exec(code)
...: print(locals())
...: return foo()
...:

In [5]: f()
{'foo': <function foo at 0x7f780dcb48c8>, 'code': 'def foo():\n\treturn 1'}
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-5-0ec059b9bfe1> in <module>()
----> 1 f()

<ipython-input-4-fd87a1e83c39> in f()
3 exec(code)
4 print(locals())
----> 5 return foo()

NameError: name 'foo' is not defined

函数很特殊,因为它们引入了单独的局部作用域。该范围内的变量在编译函数时是固定的(变量的数量和名称,而不是它们的值)。您可以通过检查函数的 .__code__.co_varnames 属性来看到这一点:

In [7]: f.__code__.co_varnames
Out[7]: ('code',)

当从函数内部查找名称时,将使用变量名称的固定注册表。当您调用 exec 时,该注册表不会更新。

@Avezan所示的方法之所以有效,是因为它不使用局部变量 - 它使用 locals,它由您的 exec 调用更新。

@Ishan Srivastava的解决方案之所以有效,是因为它在全局命名空间中执行代码,该命名空间没有在编译时修复的限制。

参见this blogpost有关 Python 名称查找机制以及 localexec 如何相互关联的非常好的描述。

关于即使存在于 locals() 中,python 函数也未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50838516/

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