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.NamedTuple
或collections.OrderedDict
会更合适。
我创建了两个特殊namedtuple
S: Map
和Repeated
。 您可以确定某个字段是地图还是重复执行isinstance
检查。
TYPE_ *字符串对应于protobuf字段类型。 因此,一个protobuf的消息namedtuple
将具有或者是字符串(对应于protobuf的类型)字段值,一个Repeated
或Map
对象,或另一个namedtuple
对象。
这尚未经过其他protobuf功能的测试,例如默认值Any,Oneof等。
请参阅要点中的__main__
以获取更多用法和测试。