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

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

我不打算打印一个实例,例如,打印人性化的Protobuf消息

给定一些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


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

给定示例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对象生成为值。 这是使用的“顶级”功能。

我使用nametuple类型来表示protobuf消息。 您可以通过_fields属性遍历它们的字段。 事后看来,也许typing.NamedTuplecollections.OrderedDict会更合适。

我创建了两个特殊namedtuple S: MapRepeated 。 您可以确定某个字段是地图还是重复执行isinstance检查。

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

这尚未经过其他protobuf功能的测试,例如默认值Any,Oneof等。

请参阅要点中的__main__以获取更多用法和测试。

链接地址: http://www.djcxy.com/p/77289.html

上一篇: Python: print protobuf spec (fields, types)

下一篇: Protobuf, Python: assign to a field