😺

Pythonで文字列から動的にフィールドを作成する方法(setattr)

に公開

はじめに

Pythonでは、setattr を使用することで、オブジェクトの属性(フィールド)を動的に設定することができます。特に、固定長の文字列データを解析し、各フィールドに格納する場合に役立ちます。

この記事では、setattr を活用して、固定長の文字列データをオブジェクトのフィールドとして自動的に設定する方法を、具体的なPythonクラスの実装を通じて紹介します。

setattr を使用したクラス設計

以下の Person クラスは、setattr を活用して固定長の文字列データを解析し、オブジェクトのフィールドとして格納します。

実装例

class Person:
    field_lengths = {
        "name": 16, "grade": 2, "birth_date": 10
    }

    def __init__(self, raw_data):
        self.parse_data(raw_data)

    # 文字列を field_lengths に基づいて分割し、フィールドとして設定
    def parse_data(self, raw_data):
        index = 0
        for field, length in self.field_lengths.items():
            s = raw_data.encode()[index:index+length].strip().decode()
            setattr(self, field, s)
            index += length

setattr の仕組み

上記のコードでは、以下のように setattr を使用しています。

  1. self.parse_data(raw_data)raw_datafield_lengths の各フィールドに対応する長さで分割。
  2. setattr(self, field, s) により、オブジェクト (self) に対して、フィールド名 (field) に s を設定。

この仕組みにより、データの構造が事前に決まっていても、新たなフィールドを追加する際にコードを修正する必要がなくなります。

実際の使用例

このクラスを使用して、固定長のデータからオブジェクトを作成する例を示します。

# 固定長データ(仮のデータ例)
data = "taro yamada      3 2001-12-34"

# クラスをインスタンス化
p1 = Person(data)

# 生成されたフィールドを表示
print(f"氏名: {p1.name}")
print(f"ランク: {p1.grade}")
print(f"生年月日: {p1.birth_date}")

VSCodeなどのエディタを使用したときに以下のような使い勝手の悪さがあります。

  • エラーが表示される
  • インテリジェンスが表示されない。

応用例

この手法は、以下のようなシナリオで活用できます。

  • 固定長フォーマットのデータ処理(銀行のトランザクションデータ、レース結果など)
  • CSVやバイナリデータの解析(特定のエンコーディングのデータをオブジェクト化)
  • JSONや辞書データの動的変換(APIレスポンスのパースやデータ変換)

まとめ

setattr を使用することで、固定長の文字列データを柔軟に解析し、オブジェクトのフィールドとして動的に設定できます。この方法を活用すれば、データ構造の変更に強いコードを書くことが可能になります。

Pythonで固定長データを扱う際には、ぜひ setattr を活用してみてください!

Discussion