首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python协议缓冲区中是否有Map字段的复制构造函数?

Python协议缓冲区中是否有Map字段的复制构造函数?
EN

Stack Overflow用户
提问于 2018-02-08 04:05:41
回答 2查看 3K关注 0票数 6

Python Generated Code在Python语言中解释了protobuf map fields的大多数用例,但没有解释如何将一个地图复制到另一个地图。

给定简单的映射

代码语言:javascript
复制
message Src {
    map<string, string> properties = 1;
    ...
}

message Dst {
    map<string, string> properties = 1;
    ...
}

您不能为嵌入的消息字段赋值,因此无法执行以下操作:

代码语言:javascript
复制
# Will not work.
dst = Dst()
dst.properties = src.properties

也没有CopyFrom的实现,因为map本身不是一条消息,它是消息中的一个字段。

代码语言:javascript
复制
# Will not work.
dst = Dst()
dst.properties.CopyFrom(src.properties)

我也不能复制整个消息,因为我只想要地图。

代码语言:javascript
复制
# Copies unwanted fields!
dst = Dst()
dst.CopyFrom(src)

我希望我不必遍历所有的键并逐个赋值!

代码语言:javascript
复制
# Iterate over map keys
for key in src.properties:
    dst.properties[key] = src.properties[key]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-19 18:49:45

如果映射的值是简单类型,则dst.properties.update(src.properties)应该可以工作。但是,如果您有一个带有消息类型值的映射,例如:

代码语言:javascript
复制
message Prop {
  optional string value = 1;
  optional bool is_public = 2;
}

message Src {
    map<string, Prop> properties = 1;
    ...
}

message Dst {
    map<string, Prop> properties = 1;
    ...
}

然后.update (或任何类型的直接赋值)将抛出:

代码语言:javascript
复制
ValueError: Direct assignment of submessage not allowed

取而代之的是,你必须这样做:

代码语言:javascript
复制
for k, v in src.properties.items():
  dst.properties[k].CopyFrom(v)
票数 2
EN

Stack Overflow用户

发布于 2018-06-02 02:48:07

python protobuf生成的代码中的Map字段的操作非常类似于python dicts,所以您可以使用.update()来复制:

代码语言:javascript
复制
dst.properties.update(src.properties)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48672377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档