繰り返しフィールドを含む protobuf メッセージがあります。リスト内のアイテムの 1 つを削除したいのですが、繰り返しフィールドからすべてのアイテムをリストにコピーし、繰り返しフィールドをクリアして再入力しないと、良い方法が見つからないようです。
C++にはRemoveLast()
関数がありますが、これはpython APIには表示されないようです...
繰り返しフィールドを含む protobuf メッセージがあります。リスト内のアイテムの 1 つを削除したいのですが、繰り返しフィールドからすべてのアイテムをリストにコピーし、繰り返しフィールドをクリアして再入力しないと、良い方法が見つからないようです。
C++にはRemoveLast()
関数がありますが、これはpython APIには表示されないようです...
ドキュメントに記載されているように、Protobuf で繰り返しフィールドをラップするオブジェクトは、通常の Python シーケンスのように動作します。したがって、簡単にできるはずです
del foo.fields[index]
たとえば、最後の要素を削除するには、
del foo.fields[-1]
Python では、次の方法でリストから要素を削除できます。
list.remove(item_to_be_removed)
また
del list[index]
const google::protobuf::Descriptor *descriptor = m_pMessage->GetDescriptor();
const google::protobuf::Reflection *reflection = m_pMessage->GetReflection();
const google::protobuf::FieldDescriptor* field = descriptor->FindFieldByName("my_list_name");
if (i<list_size-1)
{
reflection->SwapElements(m_pMessage, field, i, list_size-1);
}
reflection->RemoveLast(m_pMessage, field);