問題タブ [python-descriptors]
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 - Python の適応記述子
プロキシ オブジェクトを返すクラスにある種の記述子を作成したいと考えています。プロキシ オブジェクトは、インデックスが作成されると、オブジェクトのメンバーを取得し、それらにインデックスを適用します。次に、合計を返します。
例えば、
メンバー変数として実際の配列がある間、このソリューションはうまくいきました:
これで、配列を Python 記述子に変更しました ( cluster_signal
numpy 配列を返す記述子プロトコルを実装します)。
append ステートメントは記述子呼び出しの結果を追加するため、これは機能しません。必要なのは、バインドされたメソッドまたは同様のプロキシを追加することです。ソリューションを変更する最も良い方法は何ですか? つまり、変数basic_in
とexplanation_in
はnumpy
配列でした。それらは記述子になりました。ArraySumProxy
実際の配列を必要とするのではなく、記述子で動作するバージョンを開発したいと思います。
python - 「namedtuple」に触発された「namedlist」クラスの改善
バックグラウンド
に似た型が必要でしたnamedtuple
が、変更可能なフィールドがありました。は次のnamedlist
ように動作する必要があります。
あちこちで記述子について少し学んだ後、上記のように次のコードが機能するようになりました。
質問
このIndexAccessor
クラスは私には定型句のように感じられるので、それを避けるためにコードを改善できるかどうか疑問に思っています。
for index, field in enumerate(fields)
ループをこれに置き換えてみました
...しかし、それによりprint a, b, st.a, st.b
ステートメントがの123 456 456 456
代わりに生成されました。123 456 123 456
これは、必要に応じて機能しないことに関係があると思わindex
れます。
次のように、コンストラクターで名前ベースの割り当てを可能にする簡潔なコードも提供できる回答のボーナスポイント
python - 追加の引数を指定して Python 記述子の __get__ を呼び出しますか?
記述子を取得するときに追加の引数を渡すことは可能ですか?
たとえば、次のようにします。
そして、次のように使用できます。
そして、次を取得します。
これを機能させる方法はありますか?必要なパラメーターを呼び出しelem1.__get__(self, self.__class__, extra_text='extra)
て作成しようとしましextra_text
たが、実際にそれを提供する方法がわかりませんでしたか?
記述子を使用しない場合、この構文を実現する別の方法はありますか?
ありがとう!
python - D Python 記述子のようなメタプログラミング?
フレームワークの一部を Python から D に変換しようとしていますが、1 つの詳細に苦労しています。しかし、最初にスコープを拡張する必要があります。コンポーネントは ORM のようなものです。私のユーザーはクラスを定義します。これらのインスタンスはデータベースで永続化されます。ユーザー API は、できるだけ単純にする必要があります。例えば
load-function は、データベースからインスタンス データをロードします。ただし、ほとんどのアプリケーションは車で動作し、所有者はめったに使用されないため、車の所有者のロードはインスタンスが使用されるまで延期する必要があります。
Python では、 Descriptor-Protocolを使用してこの動作を実装できます。記述子である「フィールド」クラスのセットがあります。例えば
EntityClass には、必要な接続を配線する適切なメタクラスがあります。ユーザーは Python で次のように定義します。
そしてクラスを使用します:
内部では、myCar.power への呼び出しが次のように展開されます。
データベースから車をロードする場合、所有者 ID のみをロードします。所有者を使用する場合
データベースから延期された Person インスタンスをロードできます
ORM を DI に変換するために、さまざまな実装が試みられました。単純なベースタイプの場合、ユーザー定義属性 (UDA) をテンプレートおよび統一された呼び出し構文と組み合わせて使用するのは非常に簡単です。
この API は Python-API と同じくらい単純ですが、所有者の遅延読み込みを実装する方法がわかりません。所有者メンバーをプロパティ関数に置き換える必要がありますが、コンパイル時のメタ プログラミングを使用してこれを行う方法がわかりません。では、これはどのように行われるのでしょうか?または、慣用的な方法はありますか?
python - Python リストの変更を文字列属性に反映する
以下を実装するためのエレガントな(効率的な)方法を探しています:
値のリストを文字列として格納するクラスがあります(セパレーター付き、例: " - ")。プロパティ (ゲッターとセッター) を使用して、この文字列を Python に変換しますlist
。
プロパティの取得/設定はOKです:
しかし、変更を自動的に反映する何か (別の種類のリストかもしれません) を探していlist
ます。
list
現在、コールバック システムで継承する独自のクラスを実装してcollections.MutableSequence
います。それを行うより良い方法はありますか?
編集:私の現在の解決策
次のように、「on_change」ハンドラーを含むリストを使用します。
次に、C
このハンドラーを実装して変更を反映するようにクラスを変更する必要があります。
クラスの新しいバージョンは次のとおりです。
values
そうすれば、リストの変更が属性に反映されます。
python - clang\cindex.py で CachedPropery を把握しようとしています
これは、私が持っていた他の質問に関連しており、回答がありませんでした... libclangへのPython バインディングの内部で何が起こっているのかを理解しようとしていますが、そうするのに本当に苦労しています。
clang/cindex.py の CachedProperty クラスがどのように機能するかを理解するために、 Python と Python のdecorators
両方に関する大量の記事を読みましたが、それでもすべてをまとめることはできません。descriptors
私が見た中で最も関連性の高いテキストは1 つの SO answerであり、このコード レシピは ActiveState にあります。これは少し役に立ちますが、前述したように、まだそこにはいません。
それでは、本題に移りましょう。なぜAssertionError
CIndex を作成しようとしているのかを理解したいのです。関連するコードのみをここに投稿します (cindex.py は 3646 行の長さです..)。私のコードには、関連する行が 1 つしかありません。
これは cindex.py の 2291 行を参照しており、次の結果が得られます。
これからは、一連の関数呼び出しがありますが、その理由を説明することはできません。pdb
各部分に関連する質問に沿って、コードと出力をリストします。
(事前に注意すべき重要なこと: conf.lib は次のように定義されています:)
CachedProperty コード:
Pdb
出力:
- 次の呼び出し
Index(conf.lib.clang_createIndex(excludeDecls, 0))
がCachedProperty.__get__
メソッドになるのはなぜですか? はどう__init__
ですか? - メソッドが呼び出されない場合、
__init__
どうして self.wrapped に価値があるのでしょうか?
Pdb
出力:
- 値をどこ
CachedProperty.__get__
に返す必要がありますか?CDLL.__getattr__
メソッドの呼び出しはどこから来たのですか?
私にとって最も重要な部分
これは、クラス Index が継承するの作成です。ClangObject
- しかし -
__init__
1 つのパラメーターでの呼び出しはどこにありますか? これはconf.lib.clang_createIndex(excludeDecls, 0)
戻ってきたものですか? - この番号 (40998256) はどこから来たのですか? 何度も同じ数字が出ます。私が理解している限り、それは単なる数字である必要がありますが、それが
clang.cindex.LP_c_void_p object
アサーションが失敗した理由です。
要約すると、私にとって最善の方法は、ここでの関数呼び出しのステップバイステップのガイダンスです。
python - キーが呼び出されるたびに辞書から乱数を返すにはどうすればよいですか?
ランダムダメージを与える武器を作ろうとしています。フォームのアイテムデータベースを使用してそうしています
呼び出そうとするたびに"damage"
、同じ結果が返されます。これは、乱数が生成され、その辞書キーに保存されるためだと理解しています。
ダメージが呼び出されるたびに乱数を生成するにはどうすればよいですか?
python - __set__ を使用して __get__ を使用しない記述子はどのように機能しますか?
__set__
の有無にかかわらず記述子を使用できるという事実についてどこかで読みました__get__
。
それはどのように機能しますか?
データ記述子としてカウントされますか? それは非データ記述子ですか?
コード例を次に示します。