Python:print protobuf规范(字段、类型)

2024-04-19 11:46:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我不想打印一个实例,例如Print human friendly Protobuf message

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

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

我要找的东西是:

^{pr2}$

如果能够列出.proto文件中定义的所有消息,那就更好了。在

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


Tags: 文件对象方法namepy规范json消息
1条回答
网友
1楼 · 发布于 2024-04-19 11:46:33

请参阅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;
}

产生以下内容:

^{pr2}$

module_msgs函数以protobuf模块为输入,返回一个dict,其中消息名作为键,并生成namedtuple对象作为值。这是要使用的“顶层”功能。在

我使用nametuple类型来表示protobuf消息。您可以通过_fields属性迭代它们的字段。事后看来,typing.NamedTuple或{}可能更合适。在

我创建了两个特殊的namedtuples:Map和{}。您可以确定字段是映射还是重复使用isinstance检查。在

类型字符串对应于protobuf字段类型。因此,protobuf消息namedtuple的字段值要么是字符串(对应于protobuf类型)、Repeated或{}对象,要么是另一个namedtuple对象。在

这还没有用其他protobuf特性进行测试,比如默认值、Any、one-of等

更多用法和测试请参见要点中的__main__。在

相关问题 更多 >