Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

Python3でgRPCをつかう その4:リフレクション機能

リフレクション機能は、protoファイルを扱う側の環境が同ファイルを動的に使ったりするときに使うアレコレです。

実際のところ

という事で……protoファイルで定義されてない内容も動的に解釈して使う方法をやってみます

protoファイル

syntax = "proto3";

package example;

message Person {
  string name = 1;
  int32 age = 2;
}

で、コンパイル
"example_pb2.py"というファイルができます

$ protoc --python_out=. example.proto

スクリプト

import example_pb2

def main():
    # 新しいPersonメッセージのインスタンスを作成
    person = example_pb2.Person()

    # メッセージのデスクリプタからフィールド情報を取得
    descriptor = person.DESCRIPTOR
    for field in descriptor.fields:
        print(f"Field name: {field.name}, Type: {field.type}")

    # リフレクションを使用してフィールドに動的に値を設定
    person_name_field = descriptor.fields_by_name['name']
    setattr(person, person_name_field.name, "Alice")

    person_age_field = descriptor.fields_by_name['age']
    setattr(person, person_age_field.name, 30)

    # 値を出力
    print(f"Name: {person.name}")
    print(f"Age: {person.age}")

if __name__ == "__main__":
    main()