2

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

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

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

@attr.s
class DataParameters:
    A: float = attr.ib()
    alpha: float = attr.ib()
    c: float = attr.ib()
    k: float = attr.ib()
    M_s: float = attr.ib()

    def keys(self):
        return 'A', 'alpha', 'c', 'k', 'M_s'

    def __getitem__(self, key):
        return getattr(self, key)

    def __iter__(self):
        return (getattr(self, x) for x in self.keys())

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

params = DataParameters(1, 2, 3, 4, 5)
result1 = function1(100, 200, *params, 300)
result2 = function2(x=1, y=2, **params)

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

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

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

@addtupleanddictunpacking
@attr.s
class DataParameters:
    A: float = attr.ib()
    alpha: float = attr.ib()
    c: float = attr.ib()
    k: float = attr.ib()
    M_s: float = attr.ib()

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

4

2 に答える 2