如何修改 Python 中的 Protocol-Buffers ScalarMapContainer?

How to modify a Protocol-Buffers ScalarMapContainer in Python?

我一直在尝试向 Python 中的 ScalarMapContainer 添加值。此对象由 Google 的 Protobuf3 库从 .proto:

自动生成
map<string, string> mapName = 4;

根据少量文档,我发现 ScalarMapContainer 基本上应该像普通的 dict 但不是。

我试过像普通字典一样访问它。我深入复制了它,然后在副本上调用了 MergeFrom。我还创建了一个新的 ScalarMapConatiner,然后在其上调用 MergeFrom。

# normal dict
x.mapName["key"] = "value"
from google.protobuf.json_format import MessageToJson 
print(MessageToJson(x)) # key/value not present

# deep copy
copy = deepcopy(x.mapName)
copy["key"] = "value"
x.mapName.MergeFrom(copy)
print(MessageToJson(x)) # key/value not present

# new object
myMap = ScalarMapContainer()
myMap["key"] = "value"
x.mapName.MergeFrom(myMap) # crashes

我不确定还有什么方法可以让它正常工作。

谢谢。

假设我有一个 protobuffer 消息:

[...]
message ResponseMap {
    map<string, int32> pairs = 1;
}
[...]

并使用 grpc_tools.protoc 构建我的整个原型。

server-side 可以像 dict 一样填充消息。示例:

def get_map(self, request, context):
    result = gen_pb2.ResponseMap()
    # Fill in the map
    result.pairs['a'] = 2
    result.pairs['b'] = 3
    return result
另一方面,

client-side 可以将 key-value 对读作:

response = stub.get_map([...])
for k, v in response.pairs.items():
    print(f'{k}: {v}')

items 方法可以让您迭代 key-value 对,就好像它是 dict.

在这个简单的例子中,pairsScalarMapContainer