20

繰り返しフィールドを含む protobuf メッセージがあります。リスト内のアイテムの 1 つを削除したいのですが、繰り返しフィールドからすべてのアイテムをリストにコピーし、繰り返しフィールドをクリアして再入力しないと、良い方法が見つからないようです。

C++にはRemoveLast()関数がありますが、これはpython APIには表示されないようです...

4

3 に答える 3

23

ドキュメントに記載されているように、Protobuf で繰り返しフィールドをラップするオブジェクトは、通常の Python シーケンスのように動作します。したがって、簡単にできるはずです

del foo.fields[index]

たとえば、最後の要素を削除するには、

del foo.fields[-1]
于 2013-03-09T07:17:19.290 に答える
2

Python では、次の方法でリストから要素を削除できます。

list.remove(item_to_be_removed)

また

del list[index]
于 2013-03-09T04:34:53.767 に答える
0
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);
于 2014-04-04T03:23:28.107 に答える