考虑以下嵌套函数:
def outer_func():
def inner_func():
return [pickle for _ in []]
inner_func()
我想在outer_func
中找到所有全局引用。正确的实现将找到pickle
。以下是我在Python 2中的操作方式。
outer_func.__code__.co_consts[1].co_names
但是,这在Python 3中失败,因为inner_func代码对象的co_names
为空。当全局引用位于列表推导中时,就会发生这种情况。 有人可以解释原因吗?
下面的代码片段显示了Python 2.7和3.7之间的区别。
import pickle
def outer_func():
def inner_func():
return [pickle for _ in []]
inner_func()
inner_func_code = outer_func.__code__.co_consts[1]
print("inner_func_code = {!r}".format(inner_func_code))
print("inner_func_code.co_names = {!r}".format(inner_func_code.co_names))
print("inner_func_code.co_code = {!r}".format(inner_func_code.co_code))
Python 2.7.16:
inner_func_code = <code object inner_func at 0x7f46f0bf8eb0, file "/path/to/test.py", line 20>
inner_func_code.co_names = ('pickle',)
inner_func_code.co_code = 'g\x00\x00g\x00\x00D]\x0c\x00}\x00\x00t\x00\x00^\x02\x00q\x07\x00S'
Python 3.7.14:
inner_func_code = <code object inner_func at 0x7f46f0bf8eb0, file "/path/to/test.py", line 20>
inner_func_code.co_names = ()
inner_func_code.co_code = b'd\x01d\x02\x84\x00d\x03D\x00\x83\x01S\x00'