0

次のようにデコレータを使用したい場合:

@getFunc('bar')
def foo():
    def bar():
        print 'bar'

デコレータに bar という名前の内部関数を取得させるにはどうすればよいですか?

def getFunc(str)
    def getFunc_inner(func):
        def new(*args, **kwargs):
            func(*args, **kwargs)
            myFunc = ??# Get function named {str} from func
        return new
    return getFunc_inner
4

2 に答える 2

0

デコレータは関数を「取得」することはできません。デコレーターは、関数 (装飾された関数) を取り、別の関数 (装飾プロセスの結果) を返す関数です。

ラップされた関数がその内部関数を返す場合、デコレーターによって作成された関数は、好きなことを何でも行うことができます。

関数オブジェクトが与えられた場合、そのオブジェクト内で定義された関数を名前で取得できますか?

いいえ、defステートメントは実行可能なステートメントであるためです。関数テキストの静的な外観に混乱しています。外側の関数が呼び出されるまで、アクセスできる内側の関数オブジェクトはありません。内側の関数オブジェクトが外側の関数の呼び出しの変数 (コンテキスト) を閉じるため、これは必然的にそうなります。または、より簡単に言うと、次のコードでは、2 つの関数returned1returned2は異なる関数です。

def outer(x):
    def inner(y):
        return x+y
    return inner

returned1 = outer(2)
returned2 = outer(2)
于 2013-11-09T23:48:54.743 に答える