問題タブ [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.

0 投票する
2 に答える
2658 参照

python - タプルとディクテーションのアンパックを使用して、追加のメソッドを使用せずに attrs クラスを作成する方法

かなり洗練された Python 用のモジュールを使い始めたところattrsです (または、同様に Python 3.7 DataClasses を使用することもできます)。私が持っている一般的な使用パターンは、クラスがパラメーター値のコンテナーになることです。パラメータを割り当てるときのラベル付けと、値を参照するよりクリーンな属性スタイルが気に入っていますが、順序付けられた dict のようなものに値を格納するときに便利な機能がいくつかあることも気に入っています。

  1. *tupleaまたは a のようにアンパックlistして関数の引数にフィードする
  2. **キーワードの受け渡しが必要または望ましい場合の解凍。

クラスに 3 つのメソッドを追加することで、これらすべてを実現できます。

次に、次のようにクラスを使用できます。

ここでの動機は、データクラスが利便性と明快さを提供することです。しかし、私が書いているモジュールがデータ クラスの使用を必要としない理由があります。関数呼び出しが複雑なデータクラスではなく、単純な引数を受け入れることが望ましいです。

上記のコードは問題ありませんが、パターンが非常に明確であるため、関数の記述をまったくスキップできる何かが欠けているかどうか疑問に思っています。属性は、アンパックしたい順序で追加され、キーワード引数の属性名に基づいてキーと値のペアとして読み取ることができます。

多分これは次のようなものです:

attrsしかし、私が見つけていないこれを行う何かがそれ自体にあるかどうかはわかりません。また、属性が追加されたときに属性の順序を維持し、それをキーメソッド自体に変換する方法がわかりません。

0 投票する
1 に答える
612 参照

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はオブジェクトがなく、注釈は元のオブジェクトとしてではなく文字列として渡され、添付されていますが、新しい注釈の場合は、モジュール内で名前のルックアップのみを行います。注釈が定義されている場所では定義されていません。FooFoodataclass__init__"Foo"Fooget_type_hints__init__

何か間違ったことをしているに違いないような気がします。これら 2 つの新機能の連携がうまくいかないことに驚いています。メソッドの型ヒントを調べて、__init__通常のクラスと同じようにデータクラスで機能する適切な方法はありますか?

0 投票する
1 に答える
4823 参照

python - データクラスを使用してフィールド値を生成する方法は?

私は次のクラスを持っています:

このクラスをdataclassとして書き直すにはどうすればよいですか?

具体的には、フィールドをどのようidに宣言する必要がありますか? これには生成された値があり、インスタンスを作成するコードが提供するフィールドではありません。