在gRPC消息字段中使用任何类型的正确方法是什么?

时间:2019-12-10 07:57:15

标签: python grpc

我的消息定义如下:

    import "google/protobuf/any.proto";

    service TSSwitch {
       rpc start_ts_analytic (StartTSAnalyticRequest) returns (SwitchResponse) {}
    }

    message StartTSAnalyticRequest {
        google.protobuf.Any config = 4;
    }

我已经在客户端实现了以下内容:

    from google.protobuf.any_pb2 import Any

    config = {
            "a": true,
            "b": [[576, 667, 360, 998],
                           [1483, 940, 1348, 676]],
            "c": [0,600, 1500, 600],
            "helmet_violation": false
        }

    cfg = Any().Pack(config)
    req = switch_pb2.StartTSAnalyticRequest(config=cfg)

但是执行后,我在客户端遇到了这样的错误:

   'BaseDict' object has no attribute 'DESCRIPTOR'

我做错了什么?请帮我解决这个问题:(

1 个答案:

答案 0 :(得分:1)

不幸的是,Any proto并不意味着可以对任何Python对象进行编码的proto消息,而是能够将任何其他proto消息及其类型打包在一起的proto消息。

在您的用例中,如果您想通过字典,可以考虑:

  1. 为您的配置创建原始消息;
  2. 将配置编码为字节(JSON / Pickle),然后将其保存在原始消息字段之一中。