1


0

なぜこれがうまくいかないのですか? どうやって動かすの? つまり、装飾された関数内でguをどのようにアクセス可能にすることができますか

defデコレート(f):def new_f():def gu():pass f()return new_f

@decorate def fu():gu()

fu()

どういうわけか、定義された関数の辞書にguを追加する必要がありますか? それともそれを呼び出す前にfのローカル名前空間にguを追加することはできますか?

5 Answer


2


もし gu`を fu`に渡す必要があるなら、パラメータでこれを明示的に行う必要があります。

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

@decorate
def fu(gu):
    gu()

fu()


1


  • gu new_f 関数に対してローカルであり、これは decorate *関数に対してローカルです。


1


gu()はnew_f()内でのみ定義されています。 それを返すか、new_f()か他のものに固定しない限り、new_f()の外側から参照することはできません。

あなたが何をしているのか私にはわかりませんが、この方式は非常に複雑に思えます。 たぶんあなたはそれほど複雑でない解決策を見つけることができます。


0


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

新規インポート

def with_bar(func):def bar(x):1を返す、func.func_closure)

@with_bar def foo(x):戻りバー(x)

print foo(5)#6を印刷する

実際には、これを実行するためのより良い方法を本当に見つけるべきです。 パラメータとして関数を渡すことは1つの選択肢です。 他にも方法があるかもしれませんが、高レベルの問題の説明がないと何が当てはまるかを見分けるのは困難です。


0


デコレータを関数ではなくクラスにしないのはなぜですか。 組み込みの `property`のヘルプを見たときに発見したように、それは明らかに可能です。 (以前は、単にデコレータをクラスに適用できるだけで、デコレータ自体がクラスになることはできないと考えていました。)

(もちろん、 `gu`はクラスまたは内部クラスのメソッドでなければならないでしょう。)