如何修改 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
.
在这个简单的例子中,pairs
是 ScalarMapContainer
。
我一直在尝试向 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
.
在这个简单的例子中,pairs
是 ScalarMapContainer
。