Python:打印protobuf规范(字段,类型)

时间:2018-01-02 16:11:10

标签: python protocol-buffers

如果您有一个与module_name_pb2.py文件对应的模块对象,或者访问.proto文件本身,有没有办法以漂亮的方式打印规范本身? JSON?我想显示字段和类型。

希望打印实例,例如Print human friendly Protobuf message

给出一些protobuf消息格式(在.proto文件中定义),如:

message XYData {
    float x = 1;
    float y = 2;
}

我正在寻找类似的东西:

{
   "name" : "XYData",
   "fields" : [
                {"name" : "x", "type" : "float"},
                {"name" : "y", "type" : "float"}
              ]
}

能够列出.proto文件中定义的所有消息也很好。

编辑:也许是这样的,但在Python中:https://github.com/devongovett/protobuf-jsonschema

1 个答案:

答案 0 :(得分:2)

请参阅Python模块和示例protobuf定义here

给出示例protobuf定义:

syntax = "proto3";

message Data1 {
    double a = 1;
    float b = 2;
    int32 c = 3;
    int64 d = 4;
    bool e = 5;
    string f = 6;
    bytes g = 7;
}

message Data2 {
    Data1 a = 1;
    map<string, Data1> b = 2;
    map<string, int32> c = 3;
    repeated Data1 d = 4;
    repeated int32 e = 5;
}

以下内容:

>>> import test_pb2
>>> msgs = module_msgs(test_pb2)
>>> print(msgs)

{'Data1': Data1(a='TYPE_DOUBLE', b='TYPE_FLOAT', c='TYPE_INT32', d='TYPE_INT64', e='TYPE_BOOL', f='TYPE_STRING', g='TYPE_BYTES'),
 'Data2': Data2(a=Data1(a='TYPE_DOUBLE', b='TYPE_FLOAT', c='TYPE_INT32', d='TYPE_INT64', e='TYPE_BOOL', f='TYPE_STRING', g='TYPE_BYTES'), b=Map(key='TYPE_STRING', value=Data1(a='TYPE_DOUBLE', b='TYPE_FLOAT', c='TYPE_INT32', d='TYPE_INT64', e='TYPE_BOOL', f='TYPE_STRING', g='TYPE_BYTES')), c=Map(key='TYPE_STRING', value='TYPE_INT32'), d=Repeated(value=Data1(a='TYPE_DOUBLE', b='TYPE_FLOAT', c='TYPE_INT32', d='TYPE_INT64', e='TYPE_BOOL', f='TYPE_STRING', g='TYPE_BYTES')), e=Repeated(value='TYPE_INT32')),
}

module_msgs函数将protobuf模块作为输入,并返回带有消息名称作为键的dict,并生成namedtuple个对象作为值。这是&#34;顶级&#34;功能使用。

我使用nametuple类型来表示protobuf消息。您可以通过_fields属性迭代其字段。事后看来,typing.NamedTuplecollections.OrderedDict可能更合适。

我创建了两个特殊的namedtupleMapRepeated。您可以确定某个字段是地图还是重复isinstance项检查。

TYPE_ *字符串对应于protobuf字段类型。因此,protobuf消息namedtuple将具有字符串值(字符串对应于protobuf类型),RepeatedMap对象或另一个namedtuple对象。

尚未使用其他protobuf功能测试,例如默认值,Any,Oneof等。

有关更多用法和测试的信息,请参阅要点中的__main__