2

次のような関数と内部関数があるとします (これは変更できません)。

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

そして、そのようなinner_fに対応するouter_fの呼び出されたバージョンである関数「func」のみを取得します。

>>> func = outer_f(int)

このような場合、「some_callable」という名前の変数は int 型であり、パラメーターを指定して func を呼び出すと、次のような応答が得られます。

>>> func('1')
2

func関数インスタンスしかない場合 (つまりouter_f が呼び出された後)、関数の外部からsome_callableにアクセスしたいと思います。

私が間違っていなければ、some_callable は関数 inner_f の自由変数 (func.func_code.co_freevars) です。func を見るだけで、パラメーター int で func が呼び出されていることをどのように知ることができますか?

inspect モジュールを使用したり、関数の属性を調べたりして、問題を解決できませんでした。トレース モジュールで func を呼び出してからスタック トレースを調べたり、pdb を使用したりする方法は有望に思えますが、見苦しいハックのようなものです。

この質問は単純に、関数のスコープの自由変数に外部からアクセスすることを単純化します。

では、関数を実行せずに、自由変数「some_callable」が「int」であることをどのように知ることができますか?

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 に答える