問題タブ [decorator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 非ローカル等価でデコレータを実装する方法は?
こんにちは、現在、プログラムの 1 つをリファクタリングしていて、興味深い問題を発見しました。
オートマトンにトランジションがあります。遷移には常に開始状態と終了状態があります。一部のトランジションには、トラバーサル時に実行する必要がある特定のアクションをエンコードするラベルがあります。ラベルがないということは、アクションがないことを意味します。一部の遷移には条件があり、この条件をトラバースするために満たす必要があります。条件がない場合、遷移は基本的に NFA のイプシロン遷移であり、入力シンボルを消費せずにトラバースされます。
次の操作が必要です。
- トランジションにラベルがあるかどうかを確認する
- このラベルを入手
- トランジションにラベルを追加する
- 遷移に条件があるかどうかを確認する
- この状態になる
- 等しいかどうかを確認する
最初の 5 つのポイントから判断すると、これは明確なデコレーターのように思えます。基本遷移と 2 つのデコレーター (Labeled と Condition) があります。ただし、このアプローチには問題があります。開始状態と終了状態が同じで、両方の遷移のラベルが同じ (または存在しない) で、両方の条件が同じ (または存在しない) 場合、2 つの遷移は等しいと見なされます。 . デコレーターを使用すると、2 つの遷移 Labeled("foo", Conditional("bar", Transition("baz", "qux"))) と Conditional("bar", Labeled("foo", Transition("baz) ", "qux"))) 非ローカルの等価性が必要です。つまり、デコレーターはすべてのデータを収集する必要があり、遷移はこの収集されたデータをセットベースで比較する必要があります。
これはクリーンなアプローチですか?何か不足していますか?
私はこれを解決できるので、ほとんど混乱しています-より長いクラス名で-協調多重継承を使用します:
クラス LabledConditionalTransition は期待どおりに動作します。そこにコードがないことは魅力的であり、このサイズで MI が混乱することはありません。
もちろん、3 番目のオプションは、すべてを 1 つのトランジション クラスにまとめて、一連の has_label/has_transition にすることです。
だから...私は混乱しています。何か不足していますか?どちらの実装が見栄えがしますか? 同様のケース、つまり、Decorator で処理できるように見えるオブジェクトをどのように処理しますか?
EDIT : ConditionalTransition クラスを追加しました。基本的に、これはデコレータのように動作しますが、デコレータを作成する順序によって作成された順序を差し引いたものです。トランジションは開始と終了が正しいかどうかをチェックし、LabeledTransition クラスはラベルが正しいかどうかをチェックし、ConditionalTransition は条件が正しいかどうかをチェックします。
python - 装飾された関数の署名を保持する
非常に一般的なことを行うデコレータを作成したとします。たとえば、すべての引数を特定の型に変換したり、ロギングを実行したり、メモ化を実装したりできます。
次に例を示します。
これまでのところすべて順調です。ただし、問題が 1 つあります。装飾された関数は、元の関数のドキュメントを保持しません。
幸いなことに、回避策があります。
今回は、関数名とドキュメントは正しいです。
しかし、まだ問題があります: 関数の署名が間違っています。「*args, **kwargs」という情報はほとんど役に立ちません。
何をすべきか?2 つの単純だが欠陥のある回避策を考えることができます。
1 -- docstring に正しい署名を含めます。
これは重複のために悪いです。署名は、自動生成されたドキュメントではまだ正しく表示されません。関数を更新して docstring の変更を忘れたり、タイプミスをしたりするのは簡単です。[そして、はい、docstring が既に関数本体を複製しているという事実を認識しています。これは無視してください。funny_function は単なるランダムな例です。]
2 -- デコレータを使用しないか、特定のシグネチャごとに専用のデコレータを使用します。
これは、同一のシグネチャを持つ一連の関数に対してはうまく機能しますが、一般的には役に立ちません。冒頭で述べたように、デコレータを完全に汎用的に使用できるようにしたいと考えています。
完全に一般的で自動のソリューションを探しています。
問題は、装飾された関数シグネチャを作成後に編集する方法はありますか?
それ以外の場合、装飾された関数を構築するときに、関数シグネチャを抽出し、「* kwargs、** kwargs」の代わりにその情報を使用するデコレータを作成できますか? その情報を抽出するにはどうすればよいですか? 装飾された関数をどのように構築すればよいですか -- exec を使用して?
他のアプローチはありますか?
python - cwdを復元するデコレータを作成するにはどうすればよいですか?
現在の作業ディレクトリを、decorated関数が呼び出される前の状態に復元するデコレータを作成するにはどうすればよいですか?つまり、を実行する関数でデコレータを使用するとos.chdir()
、関数が呼び出された後、cwdは変更されません。
design-patterns - 柔軟なデコレータ パターン?
個人的なプロジェクトでやろうと考えていることをモデル化するためのパターンを探していましたが、デコレータ パターンの修正版が機能するかどうか疑問に思っていました。
基本的には、キャラクターが装備したアイテムによって属性が変化するゲームを作ろうと考えています。デコレーターが変更をスタックする方法はこれに最適ですが、中間のデコレーターをドロップできるデコレーターを見たことがありません。これは、アイテムが装備されていないときに起こることです。
この方法でデコレータ パターンを使用した経験がある人はいますか? それとも、間違った木を吠えていますか?
明確化
たとえば、私の基本クラスが砂糖で装飾されたミルクで飾られたコーヒーである場合、「中間デコレーター」を説明するには (Head first design patterns の例を使用) ミルクは、ベース コーヒーを装飾し、装飾されるため、中間デコレーターになります。砂糖によって。
さらに明確化:)
アイデアは、アイテムが統計を変更するということです。これにデコレータを押し付けていることに同意します。ステートバッグを調べてみます。基本的に、私は統計の単一の呼び出しポイントと、アイテムが装備されている/装備されていないときにそれらが上昇/下降することを望んでいます。
装備時にモディファイアをキャラクターの統計に適用し、装備を外すときにそれらを元に戻すことができました。または、統計が要求されるたびに、すべてのアイテムを繰り返し処理して統計を計算します。
ここでフィードバックを探しているところです。ハサミの方が適切なチェーンソーを使用している可能性があることは承知しています...
java - 改善されたコレクション イテレータ
個人的には、java.util.Iterator によって提供される機能の範囲はかなり哀れだと思います。少なくとも、次のようなメソッドが必要です。
- peek() はイテレータを進めずに次の要素を返します
- previous() は前の要素を返します
first() や last() など、他にも多くの可能性があります。
そのようなサードパーティのイテレータが存在するかどうかは誰にもわかりませんか? 既存の Java コレクションと連携できるように、おそらく java.util.Iterator のデコレーターとして実装する必要があります。理想的には、「ジェネリック対応」である必要があります。
前もってありがとう、ドン
python - Django では、Django の update_object ジェネリック ビューを使用して、継承されたモデルのフォームを編集するにはどうすればよいでしょうか?
Django では、動物が好きなアプリケーションからの抜粋を以下に示します。
以下の動物/models.py :
そしてanimal/urls.py :
一般的なビューを使用して、同じフォームを使用して犬や猫を編集するにはどうすればよいですか?
すなわち、 animals/animal_form.htmlに渡されるフォームオブジェクトはAnimal になるため、派生クラス Dog および Cat の詳細は含まれません。Django に子クラスのフォームをanimal/animals_form.htmlに自動的に渡すにはどうすればよいですか?
ちなみに、私はContentType の管理にDjangosnippets #1031を使用しているため、Animalには派生クラスを返すas_leaf_classという名前のメソッドがあります。
明らかに、派生クラスごとにフォームを作成することもできますが、それはかなりの不要な重複です (テンプレートはすべてジェネリックになるため、基本的には {{ form.as_p }})。
ちなみに、Animal はおそらく同じ問題を抱えたいくつかの無関係な基本クラスの 1 つであると想定するのが最善です。そのため、理想的な解決策はジェネリックです。
助けてくれてありがとう。
python - クロージャではなく Python デコレータを使用する理由
私はまだ Python のデコレータについて理解していません。
コーディングで関数やクラスをカスタマイズするなどのことを行うために、すでに多くのクロージャを使用し始めています。
例えば。
私が見る限り、デコレータは似たようなことをするための別の構文です。
それ以外の
私は書くだろう:
デコレータはこれだけですか?それとも、私が見逃した根本的な違いはありますか?
python - メソッドのパラメータ名を取得するには?
与えられた Python 関数:
引数の数と名前を抽出するにはどうすればよいですか。つまり、 への参照があることを考えると、が を返すようにしfunc
たいのです。func.[something]
("arg1", "arg2")
これの使用シナリオは、デコレーターがあり、実際の関数にキーとして表示されるのと同じ順序でメソッド引数を使用したいということです。"a,b"
つまり、私が呼び出したときにデコレータはどのように表示されますa_method("a", "b")
か?
java - デコレータ デザイン パターンでデコレータが必要なのはなぜですか?
という名前のクラスがありA
、decorator デザイン パターンを使用したいとします。間違っている場合は訂正してください。ただし、それを機能させるADecorator
には、インスタンスへの参照を保持するデコレータ クラス (たとえば、 )を作成する必要がありA
ます。他のすべてのデコレータはこれを拡張して機能を追加します。
A
インスタンスを使用する代わりに、デコレータ クラスを作成する必要がある理由がわかりません。
python - 呼び出し前の Python 装飾関数
私は他の誰かによって書かれたかなり複雑なデコレータを持っています。私がやりたいことは、決定に基づいて関数の装飾されたバージョンを1回呼び出すか、元の関数(装飾されていない)を別の時間に呼び出すことです。これは可能ですか?