Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python文件中使用google.protobuf.Any_Python_Protocol Buffers_Any - Fatal编程技术网

在python文件中使用google.protobuf.Any

在python文件中使用google.protobuf.Any,python,protocol-buffers,any,Python,Protocol Buffers,Any,我有这样的.proto文件 syntax = "proto3"; import "google/protobuf/any.proto"; message Request { google.protobuf.Any request_parameters = 1; } 如何创建Request对象并填充其字段?我试过这个: import ma_pb2 from google.protobuf.any_pb2 import Any parameters = {"a": 1, "b": 2} R

我有这样的
.proto
文件

syntax = "proto3";
import "google/protobuf/any.proto";

message Request {
  google.protobuf.Any request_parameters = 1;
}
如何创建
Request
对象并填充其字段?我试过这个:

import ma_pb2
from google.protobuf.any_pb2 import Any

parameters = {"a": 1, "b": 2}
Request = ma_pb2.Request()
some_any = Any()
some_any.CopyFrom(parameters)
Request.request_parameters = some_any
但我有一个错误:

TypeError: Parameter to CopyFrom() must be instance of same class: expected google.protobuf.Any got dict.
Request.request_parameters = small
AttributeError: Assignment not allowed to field "request_parameters" in protocol message object.
更新

以下@Kevin I的提示将新消息添加到
.proto
文件中:

message Small {
  string a = 1;
}
现在代码如下所示:

Request = ma_pb2.Request()
small = ma_pb2.Small()
small.a = "1"

some_any = Any()
some_any.Pack(small)

Request.request_parameters = small
但在上一次作业中,我有一个错误:

TypeError: Parameter to CopyFrom() must be instance of same class: expected google.protobuf.Any got dict.
Request.request_parameters = small
AttributeError: Assignment not allowed to field "request_parameters" in protocol message object.

我做错了什么?

任何
都不是存储任意键和值的魔法盒。
Any
的目的是在运行时才知道要使用哪条消息的情况下。但在运行时,您仍然需要记住一些特定的消息。然后,您可以将该消息转换为
Any
,此时您可以这样做

因此,如果要存储此特定词典:

{"a": 1, "b": 2}
…您需要一个
.proto
文件,该文件描述了一些消息类型,其中包含名为
a
b
的整数字段。就我个人而言,我认为这是过分的;只需将
a
b
字段直接放入
请求
消息中,除非您有充分的理由将它们分开。如果您“忘记”了其中一个键,那么不要太担心完整性


如果你真的想要一个“存储任意键和值的魔盒”,而不是我上面所描述的,你可以使用一个,而不是
Any
。这样做的好处是,在密钥集可能包含任意字符串(例如HTTP头)的情况下,不需要预先声明所有密钥。它的缺点是很难进行lint或类型检查(特别是在静态类型语言中),因为与属性相比,字符串更容易拼写错误。如链接资源中所示,映射基本上是重复字段的语法糖,如下所示(即,在线表示与执行此操作所得到的完全相同,因此它向后兼容不支持映射的客户端):


同样的错误
不允许在协议消息对象中的“request\u parameters”字段分配。
哦,对了,这是一个消息字段,您需要。