2013-03-09 13 views
6

Mam komunikat protobuf zawierający powtarzające się pole. Chciałbym usunąć jedną z pozycji na liście, ale nie mogę znaleźć dobrego sposobu, aby to zrobić bez skopiowania wszystkich elementów z powtarzanego pola do listy, wyczyszczenia powtarzanego pola i ponownego zaludnienia go.Jak mogę usunąć przedmiot z powtarzanego pola protobuf w pythonie?

W C++ jest tam RemoveLast() funkcja, ale to nie wydaje się pojawiać w API Pythona ...

Odpowiedz

10

jak wskazano w documentation, celem owijania powtarzany pola w buforów zachowuje się jak zwykły sekwencji Pythona. Dlatego należy być w stanie po prostu zrobić

del foo.fields[index] 

Na przykład, aby usunąć ostatni element,

del foo.fields[-1] 
+1

Jeśli chcesz usunąć wszystkie powtarzające się pola, użyj 'del foo.fields [:]' –

1

w Pythonie, usuwanie elementu z listy można zrobić w ten sposób:

list.remove(item_to_be_removed) 

lub

del list[index] 
+0

To nie jest lista pyton. Jest to typ niestandardowy. Usuń nie jest członkiem. – Catskul

+1

@Catskul to faktycznie działa jak protobuf 2.6; dodali podobne do listowych operacje typu 'extend()' i 'remove()' do typu 'RepeatedCompositeFieldContainer'. – 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

Odpowiedź wyraźnie wymaga API Pythona ... – nneonneo

Powiązane problemy