リフレクション機能は、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()