2013-03-09 115 views
6

我有一個包含重複字段的protobuf消息。我想刪除列表中的某個項目,但似乎無法找到一個好方法,無需將所有項目從重複字段中複製到列表中,清除重複字段並重新填充。如何從python中的重複protobuf字段中刪除項目?

在C++中有一個RemoveLast()功能,但是這似乎並沒有出現在Python的API中......

回答

10

documentation指出的,在包裝紙的Protobuf重複字段的對象的行爲就像一個常規的Python序列。因此,你應該能夠簡單地做

del foo.fields[index] 

例如,刪除最後一個元素,

del foo.fields[-1] 
+1

如果你想刪除所有重複的字段,使用'del foo.fields [:]' – 2014-05-02 02:42:23

1

在Python,刪除從列表中的元素以這種方式可以這樣做:

list.remove(item_to_be_removed) 

del list[index] 
+0

這不是一個Python列表。這是一種自定義類型。刪除不是會員。 – Catskul 2013-11-05 19:47:07

+1

@Catskul這實際上作爲protobuf 2.6;他們已經將類似pythonic的操作'extend()'和'remove()'添加到'RepeatedCompositeFieldContainer'類型中。 – chase 2014-12-15 23:44:17

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

答案顯然要求Python API ... – nneonneo 2014-04-06 03:21:19

相關問題