2013-03-09 6 views
6

Ich habe eine Protobuf-Nachricht, die ein wiederholtes Feld enthält. Ich möchte eines der Elemente in der Liste entfernen, aber ich kann keinen guten Weg finden, dies zu tun, ohne alle Elemente aus dem wiederholten Feld in eine Liste zu kopieren, das wiederholte Feld zu löschen und es erneut zu füllen.Wie kann ich ein Element aus einem wiederholten Protobuf-Feld in Python entfernen?

In C++ gibt es eine RemoveLast() Funktion, aber dies scheint nicht in dem Python-API zu erscheinen ...

Antwort

10

wie in der documentation erwähnt, kann das Objekt ein sich wiederholendes Feld in Protobuf Umwickeln verhält sich wie eine normale Sequenz, Python. Daher sollten Sie in der Lage sein, einfach

del foo.fields[index] 

Zum Beispiel zu tun, das letzte Element zu entfernen,

del foo.fields[-1] 
+1

Wenn Sie alle wiederholten Felder löschen möchten, verwenden Sie 'del foo.fields [:]' –

1

In Python, ein Element aus einer Liste zu löschen auf diese Weise getan werden könnte:

list.remove(item_to_be_removed) 

oder

del list[index] 
+0

Diese Liste ist nicht ein Python ist. Es ist ein benutzerdefinierter Typ. Entfernen ist kein Mitglied. – Catskul

+1

@Catskul funktioniert das eigentlich wie von Protobuf 2.6; Sie haben die pythonischen listenähnlichen Operationen 'extend()' und 'remove()' zum Typ 'RepeatedCompositeFieldContainer' hinzugefügt. – chase

1
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); 
+5

Die Antwort fragt eindeutig nach einer Python-API ... – nneonneo

Verwandte Themen