Protobufメッセージへの文字列によるアクセス
Protobufのメッセージ型に文字列型をキーとしてアクセスする方法
メッセージ例
以下のメッセージ定義を用いて説明していきます。メンバとして繰り返し型のvalues
および、内部メッセージ型のwords
を定義しています
syntax = "proto3"; message NestedMessage { string name = 1; repeated double values = 2; message InnerMessage { uint32 word_hi = 1; uint32 word_lo = 2; } InnerMessage words = 3; }
基本データ型へのアクセス
getattr()
、setattr()
でアクセスします
pm = nested_message_pb2.NestedMessage() # 書き込み setattr(pm, 'name', 'Dummy NestedMessage') # 読み出し d = getattr(pm, 'name')
リピート型へのアクセス
getattr()
+ append()
またはextend()
pm = nested_message_pb2.NestedMessage() # リピート型へのアクセス getattr(pm, 'values').append(1) getattr(pm, 'values').extend([2, 3])
内部メッセージ型へのアクセス
getattr()
+ setattr()
pm = nested_message_pb2.NestedMessage() # 内部メッセージ型へのアクセス setattr(getattr(pm, 'words'), 'word_hi', 1234) setattr(getattr(pm, 'words'), 'word_lo', 5678)
リピート型、内部メッセージ型の判定方法
FieldDescriptor
のcpp_type
およびlabel
で判定します
from google.protobuf.descriptor import FieldDescriptor as fd pm = nested_message_pb2.NestedMessage() # フィールドがメッセージ型かどうかの判定方法 assert pm.DESCRIPTOR.fields_by_name['words'].cpp_type == fd.CPPTYPE_MESSAGE # フィールドがリピート型かどうかの判定方法 assert pm.DESCRIPTOR.fields_by_name['values'].label == fd.LABEL_REPEATED
最近のコメント