2

让我们考虑一下我们有一个这样的函数和一个内部函数(我们无法更改):

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函数实例(这意味着在调用 external_f之后)时,我想从函数外部访问some_callable

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

我无法使用检查模块或查看函数的属性来解决问题。使用跟踪模块调用 func 然后检查堆栈跟踪或使用 pdb 之类的方法似乎很有希望,但它们会是一种丑陋的 hack。

这个问题只是简化为从外部访问函数范围的自由变量。

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

4

1 回答 1

2

你可以做:

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'>
于 2016-07-17T21:09:31.450 回答