如何从外部访问函数的 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'>
假设我们有一个函数和一个像这样的内部函数(我们无法更改):
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'>