gpt4 book ai didi

python - 从文件描述符集中提取 Protobuf 自定义选项?

转载 作者:行者123 更新时间:2023-12-05 06:49:45 30 4
gpt4 key购买 nike

假设我们有一个名为foo.proto 的文件,它定义了一条消息和一个custom option。 :

syntax = "proto3";

package foo_package;

import "google/protobuf/descriptor.proto";

enum State {
ALPHA = 0;
BETA = 1;
}

extend google.protobuf.FieldOptions {
State baz = 51234;
}

message Foo {
string bar = 1 [ (baz) = ALPHA ];
}

我们生成一个 FileDescriptorSet (来自包含 google/protobuf/descriptor.proto 的目录)通过以下方式获取此消息:

protoc -I=. --include_imports -oTMP ./foo.proto

我如何从这个集合中的消息类实例中提取 baz 文档和库 (1) , (2)建议这样的事情可能有效:

from google.protobuf.descriptor_pb2 import FileDescriptorSet
from google.protobuf.message_factory import GetMessages

with open("TMP", mode="rb") as f:
fds = FileDescriptorSet.FromString(f.read())

messages = GetMessages([file for file in fds.file])
extensions = messages["foo_package.Foo"].DESCRIPTOR.fields_by_name["bar"].GetOptions().Extensions

但是生成的对象是空的。 #6662暗示使用 DescriptorPool 应该可以解决它,但这似乎也不起作用(也是空对象)。

最佳答案

GetOptions() 将为您提供内置的非扩展类型google.protobuf.FieldOptions。在 protobuf 实现中,GetOptions() 构造一个内置类型 google.protobuf.FieldOptions 的消息,然后将字节解析为该结构。您可以在 Python impl 中看到它,例如:https://github.com/protocolbuffers/protobuf/blob/5df4c2ec9426b06dfe8a019ddcf1509b8816cebe/python/google/protobuf/descriptor.py#L167-L170

消息描述符确实具有您定义的选项;您可以打印字段选项的序列化版本,您会看到它们,但它们不会解析为结果字段选项。非扩展类型不描述这些附加字段,因此它们将被忽略。

您真正想要的是使用 google.protobuf.FieldOptions 的扩展版本来解析选项。

我不确定是否有更优雅的方法来执行此操作,但对我有用的是重新序列化选项,然后使用扩展的 FieldOptions 的动态版本解析它们。总体看起来像这样:

messages = GetMessages([file for file in fds.file])
Foo = messages["foo_package.Foo"]
FieldOptions = messages["google.protobuf.FieldOptions"]

bar_builtin_opts = Foo.DESCRIPTOR.fields_by_name["bar"].GetOptions()
bar_opts = FieldOptions()
bar_opts.ParseFromString(bar_builtin_opts.SerializeToString())

请注意,此过程对于所有选项类型(字段选项、消息选项等)都是相同的。

如果您在重新定义现有消息类型时遇到问题,您可能必须创建自己的描述符池和消息工厂,它们与默认的分开,尽管这很简单

pool = DescriptorPool()
for fd in fds.file:
pool.Add(fd)
factory = MessageFactory(pool)
messages = factory.GetMessages([file.name for file in fds.file])

关于python - 从文件描述符集中提取 Protobuf 自定义选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66534500/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com