問題タブ [python-dataclasses]
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 - タプルとディクテーションのアンパックを使用して、追加のメソッドを使用せずに attrs クラスを作成する方法
かなり洗練された Python 用のモジュールを使い始めたところattrs
です (または、同様に Python 3.7 DataClasses を使用することもできます)。私が持っている一般的な使用パターンは、クラスがパラメーター値のコンテナーになることです。パラメータを割り当てるときのラベル付けと、値を参照するよりクリーンな属性スタイルが気に入っていますが、順序付けられた dict のようなものに値を格納するときに便利な機能がいくつかあることも気に入っています。
*
tuple
aまたは a のようにアンパックlist
して関数の引数にフィードする**
キーワードの受け渡しが必要または望ましい場合の解凍。
クラスに 3 つのメソッドを追加することで、これらすべてを実現できます。
次に、次のようにクラスを使用できます。
ここでの動機は、データクラスが利便性と明快さを提供することです。しかし、私が書いているモジュールがデータ クラスの使用を必要としない理由があります。関数呼び出しが複雑なデータクラスではなく、単純な引数を受け入れることが望ましいです。
上記のコードは問題ありませんが、パターンが非常に明確であるため、関数の記述をまったくスキップできる何かが欠けているかどうか疑問に思っています。属性は、アンパックしたい順序で追加され、キーワード引数の属性名に基づいてキーと値のペアとして読み取ることができます。
多分これは次のようなものです:
attrs
しかし、私が見つけていないこれを行う何かがそれ自体にあるかどうかはわかりません。また、属性が追加されたときに属性の順序を維持し、それをキーメソッド自体に変換する方法がわかりません。
python - 新しい注釈はデータクラスの検査を中断します
PEP 563 では、from __future__ import annotations
型注釈が遅延評価されるように変更されます。これにより、前方参照などの多くの利点が得られます。
ただし、これはデータクラスなどの他の機能とうまく機能しないようです。たとえば、クラスの__init__
メソッドの型パラメーターを検査するコードがあります。(実際の使用例は、クラスにデフォルトのシリアライザーを提供することですが、ここでは重要ではありません。)
Python 3.6 および 3.7 では、これは期待どおりの動作をします。それは印刷し{'foo': <class '__main__.Foo'>, 'return': <class 'NoneType'>}
ます。
ただし、Python 3.7 で を追加するfrom __future__ import annotations
と、次のエラーで失敗します。
なぜこれが起こっているのか理解できたと思います。__init__
メソッドは で定義されており、その環境にdataclasses
はオブジェクトがなく、注釈は元のオブジェクトとしてではなく文字列として渡され、添付されていますが、新しい注釈の場合は、モジュール内で名前のルックアップのみを行います。注釈が定義されている場所では定義されていません。Foo
Foo
dataclass
__init__
"Foo"
Foo
get_type_hints
__init__
何か間違ったことをしているに違いないような気がします。これら 2 つの新機能の連携がうまくいかないことに驚いています。メソッドの型ヒントを調べて、__init__
通常のクラスと同じようにデータクラスで機能する適切な方法はありますか?
python - データクラスを使用してフィールド値を生成する方法は?
私は次のクラスを持っています:
このクラスをdataclassとして書き直すにはどうすればよいですか?
具体的には、フィールドをどのようid
に宣言する必要がありますか? これには生成された値があり、インスタンスを作成するコードが提供するフィールドではありません。