Python Protocol Buffer字段选项

时间:2015-09-29 05:31:01

标签: protocol-buffers

如何获得与协议缓冲区字段关联的选项?

例如,假设我有一个带有自定义选项的字段:

message Foo {
  optional string title = 1 [(indexed) = true];
}

我可以得到一个字段列表:

for f in foo.ListFields():
  print f

如何访问"索引"州? (我可以看到有一个f" _options"的列表,但似乎"内部"?是否有正确的方法来按名称访问选项扩展名?)

1 个答案:

答案 0 :(得分:4)

我将使用定义为here的nanopb自定义选项作为示例。然而,答案本身并不是特定于nanopb的,nanopb使用标准protobuf样式进行自定义选项:

message NanoPBOptions {
   optional int32 max_size = 1;
   ...
}
extend google.protobuf.FieldOptions {
   optional NanoPBOptions nanopb = 1010;
}

和一个如下定义的选项:

message Person {
   optional string email = 3 [(nanopb).max_size = 40];
}

用于获取选项值的API因语言而异。然而,基本流程是相同的:

  1. 从对象中获取消息描述符。
  2. 从消息描述符中获取字段描述符。
  3. 从字段描述符中获取选项。
  4. 从选项中获取扩展字段,并从中获取所需的值。
  5. 在Python中:

    desc = person_pb2.Person.DESCRIPTOR
    field_desc = desc.fields_by_name['email']
    options = field_desc.GetOptions()
    value = options.Extensions[nanopb_pb2.nanopb].max_size
    

    在Java中:

    desc = PersonProto.Person.getDescriptor();
    field_desc = desc.findFieldByName("email");
    options = field_desc.getOptions();
    value = options.getExtension(Nanopb.nanopb).getMaxSize();
    

    在C ++中:

    desc = Person::descriptor()
    field_desc = desc->FindFieldByName("email");
    options = field_desc->options();
    value = options.GetExtension(nanopb).max_size());