如何从外部访问函数的 FREE 变量

How to access a FREE variable of a function from outside

假设我们有一个函数和一个像这样的内部函数(我们无法更改):

from functools import wraps
def outer_f(some_callable):
    def inner_f(v):
        return some_callable(v) + 1
    return inner_f

而我们只得到一个函数'func',它是outer_f的调用版本,它对应于inner_f,像这样:

>>> func = outer_f(int)

在这种情况下,名为 'some_callable' 的变量是 int 类型,如果我们用参数调用 func,我们会得到这样的答案:

>>> func('1')
2

当我只有 func 函数实例(这意味着 之后outer_f被调用)。

如果我没记错的话,some_callable是函数inner_f(func.func_code.co_freevars)的一个自由变量。我怎么知道 func 是用参数 int 只看 func 调用的?

我无法使用检查模块或查看函数的属性来解决问题。使用跟踪模块调用 func 然后检查堆栈跟踪或使用 pdb 等方法似乎很有前途,但它们会有点丑陋。

这个问题简单地简化为从外部访问函数作用域的自由变量。

那我怎么能不执行func就知道自由变量'some_callable'是'int'呢?

你可以这样做:

import inspect
result = inspect.getclosurevars(func).nonlocals['some_callable']

示例:

>>> from functools import wraps
>>>
>>> def outer_f(some_callable):
...     def inner_f(v):
...         return some_callable(v) + 1
...     return inner_f
...
>>>
>>> func = outer_f(int)
>>>
>>> import inspect
>>> result = inspect.getclosurevars(func).nonlocals['some_callable']
>>>
>>> result
<class 'int'>