Python 如何从外部访问函数的自由变量 让我们考虑一个函数和一个类似的函数(我们不能改变< /强>):

Python 如何从外部访问函数的自由变量 让我们考虑一个函数和一个类似的函数(我们不能改变< /强>):,python,scope,traceback,inspect,free-variable,Python,Scope,Traceback,Inspect,Free Variable,我们只得到一个函数'func',它是外部函数的被调用版本,对应于内部函数,如下所示: >>> func = outer_f(int) 在这种情况下,名为'some_callable'的变量是int类型,如果我们使用参数调用func,我们会得到如下答案: >>> func('1') 2 当我只有func函数实例时,我想从函数外部访问一些可调用的(这意味着在调用外部后调用) 如果我没有弄错的话,some_callable是函数inner_f(func.func

我们只得到一个函数'func',它是外部函数的被调用版本,对应于内部函数,如下所示:

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

>>> func('1')
2
当我只有func函数实例时,我想从函数外部访问一些可调用的(这意味着在调用外部后调用

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

我无法使用inspect模块或查看函数的属性来解决问题。使用跟踪模块调用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'>
>>从functools导入包装
>>>
>>>def外部(某些可调用):
...     def内螺纹(v):
...         返回一些可调用的(v)+1
...     返回内部
...
>>>
>>>func=outer_f(int)
>>>
>>>进口检验
>>>结果=inspect.getclosurevars(func).nonlocals['some_callable']
>>>
>>>结果

您有什么可用的Python版本?您试图解决的实际问题是什么?为什么需要访问
func
?getclosurevars没有在python 2.7中实现,但多亏了您的回答,我才能够找到2.7的解决方案:很抱歉没有说明我的python版本。
>>> 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'>