1

これが機能しないのはなぜですか?どうすればそれを機能させることができますか?つまり、装飾された関数内で gu にアクセスできるようにするにはどうすればよいでしょうか?

def decorate(f):
    def new_f():
        def gu():
            pass
        f()
    return new_f

@decorate
def fu():
    gu()

fu()

どうにかして定義済み関数の辞書に gu を追加する必要がありますか? または、呼び出す前に f のローカル名前空間に gu を追加できますか?

4

5 に答える 5

3

に渡す必要がある場合はgufuパラメーターで明示的にこれを行う必要があります。

def decorate(f):
    def new_f():
        def gu():
            pass
        f(gu)
    return new_f

@decorate
def fu(gu):
    gu()

fu()
于 2009-07-17T07:56:28.813 に答える
1

guは、decorate 関数に対してローカルnew_f関数に対してローカルです。

于 2009-07-17T07:53:25.233 に答える
1

gu() は、new_f() 内でのみ定義されます。返すか、new_f() などにアンカーしない限り、new_f() の外から参照することはできません。

あなたが何をしようとしているのかはわかりませんが、このスキームは非常に複雑に思えます。より複雑でない解決策を見つけることができるかもしれません。

于 2009-07-17T07:54:30.473 に答える
0

原則として、古い関数と同じコードを使用して新しい関数を作成できますが、グローバルスコープを修正されたスコープに置き換えます。

import new

def with_bar(func):
    def bar(x):
        return x + 1
    f_globals = func.func_globals.copy()
    f_globals['bar'] = bar
    return new.function(func.func_code, f_globals,
                        func.func_name, func.func_defaults, func.func_closure)

@with_bar
def foo(x):
    return bar(x)

print foo(5) # prints 6

実際には、これを行うためのより良い方法を見つける必要があります。関数をパラメーターとして渡すことは1つのオプションです。他のアプローチもあるかもしれませんが、高レベルの問題の説明なしに何が適合するかを判断するのは困難です。

于 2009-07-17T08:56:36.463 に答える
0

デコレータを関数ではなくクラスにしてみませんか? ビルトインのヘルプを調べたときに発見したように、それは明らかに可能propertyです。(以前は、クラスにデコレータを適用するだけで、デコレータ自体がクラスになるとは考えていませんでした。)

(もちろん、guクラスまたは内部クラスのメソッドである必要があります。)

于 2009-07-17T15:38:50.907 に答える