2013-03-09 18 views
6

Tekrarlanan bir alan içeren bir protobuf mesajım var. Listedeki öğelerden birini kaldırmak istiyorum, ancak tekrarlanan alanın dışındaki tüm öğeleri bir listeye kopyalamadan, tekrarlanan alanı temizlemeden ve yeniden oluştururken, bunu yapmanın iyi bir yolunu bulamıyorum.Python'da tekrarlanan bir protobuf alanından bir öğeyi nasıl kaldırabilirim?

C'de

++ bir RemoveLast() işlevi vardır, ancak bu bu şekilde yapılabilir bir listeden bir öğe silme ... piton API Python

cevap

10

, Protobuf bir tekrarlanan alan sarma amacı, normal Python dizisi gibi davranır. Bu nedenle,

del foo.fields[-1] 
+1

Yinelenen alanların tümünü silmek istiyorsanız, 'del foo.fields [:]' –

1

görünmesini görünmüyor:

list.remove(item_to_be_removed) 

veya documentation belirtildiği gibi

del list[index] 
+0

Bu bir piton listesi değildir, sadece son öğe kaldırmak için, Örneğin

del foo.fields[index] 

yapmak mümkün olmalıdır. Bu özel bir tip. Kaldır üye değildir. – Catskul

+1

@Catskul bu aslında protobuf 2.6 olarak çalışır; pythonic liste benzeri işlemleri 'exteated()' ve 'remove()' 'RepeatedCompositeFieldContainer 'türüne eklediler. – 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

kullanın. Yanıt açıkça bir Python API'sı ister ... – nneonneo

İlgili konular