在嵌套函数中查找全局引用

时间:2019-11-18 10:31:44

标签: python python-2.7 python-3.7 cpython nested-function

考虑以下嵌套函数:

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'

0 个答案:

没有答案