1


0

最初のコードが混乱していたので編集しています。

私はこれら二つのことが同じであると思います

#私はこれらの#Option 1 def bar(* args)のどちらかを使うでしょう:pass foo = deco(bar)

#Option2 @deco def foo(* args):pass

しかし、デコレータ `deco`に副作用がある場合、これは保証されていません。 特に、これは私のデコレータからの誘惑(副作用はありません)でした、そして私は副作用があるものに出会い、それによって噛まれました、

#Option1 def bar(* args):pass foo = register.filter(bar)

#オプション2 @ register.filter def foo(val、arg):pass

では、私の期待は間違っているのでしょうか、それともdjangoがベストプラクティスと矛盾しているのでしょうか。

2 Answer


2


実際には、これらは両方ともまったく同じです。

def foo(* args):foo = deco(foo)を渡します。

@deco def foo(* args):渡す

bar`を装飾して foo`と呼びたいのなら、 foo = deco(bar)`が正しい方法です。 「これまでに定義された `bar`と呼ばれるものを飾り付けて foo`と呼びます」と言います。 デコレータ構文のポイントは、名前を変更するのではなく、定義の前にラッピング関数を記述することです。

後で `bar`を使う必要がなければ、装飾されていない関数を違う名前で呼ぶ必要はありません。 これを行うことによって、デコレータ構文sugarを使用する能力を正確に失います。

`deco`は関数である必要はありません。 これは `call`メソッドを持つオブジェクトにすることができ、これは副作用をカプセル化するのに正確に役立ちます。


0


あなたの例はすべての場合に同じことを表現するわけではありません! なぜあなたはバーを使うことを主張しますか?

最初の例を見てください。

#オプション1 def bar(* args):pass foo = deco(bar)

#Option2 @deco def foo(* args):pass

オプション1は(文字通り)行います

foo =デコ(バー)

しかし、オプション2は、

foo = deco(foo)

違いはわかりませんか。

だから、要するに、はい:あなたの仮定とあなたの期待は間違っています。

あなたがあなたの機能の装飾されていないバージョンと同様に装飾されていないバージョンを必要とするならば、ただそれを事前に保存してください:

def foo(* args):パスバー= foo foo =デコ(foo)