11

私が持っている場合:

def f(x):
  def g(y):
    return x + y
  return g

f2 = f(2)

x使用するバインディングを見つける方法はありf2ますか? 私は見ましたが、いくつかのものが当てはまるinspectかどうかわかりませんでした. frameつまり、closed_vars()以下を定義できますか。

def closed_vars(anF):
    ... return ...

assert closedVars(f2) == {'x': 2}
4

3 に答える 3

7

inspectここでモジュールを使用する必要はありません。

>>> dict(zip(f2.func_code.co_freevars, (c.cell_contents for c in f2.func_closure)))
{'x': 2}

Python 2.7 で動作します

于 2013-10-17T01:50:08.473 に答える
5

チェックアウトすることでセルの内容を取得できますf.func_closure(Python 2.7.5 で動作します):

>>> def f(x):
...   def g(y):
...     return x + y
...   return g
... 
>>> f2 = f(2)
>>> [cell.cell_contents for cell in f2.func_closure]
[2]

Python 3.3 には次のinspect.getclosurevars機能があります。

Python 関数またはメソッド func の外部名参照の現在の値へのマッピングを取得します。名前付きタプルClosureVars(nonlocals, globals, builtins, unbound)が返されます。nonlocals は、参照された名前をレキシカル クロージャ変数にマップし、グローバルを関数のモジュール グローバルにマップし、ビルトインを関数本体から見えるビルトインにマップします。unbound は、関数内で参照されている名前のセットであり、現在のモジュール グローバルとビルトインではまったく解決できませんでした。

Python 3.3 より前の閉じられた変数名を取得できるかどうかはまだわかりません。

于 2013-10-17T01:44:01.177 に答える