【发布时间】:2021-03-08 17:35:24
【问题描述】:
假设我们有一个名为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 应该可以解决它,但这似乎也不起作用(空对象也是如此)。
【问题讨论】:
-
我偶然发现这个问题正在寻找其他东西,但最近也遇到了这个问题并想通了!会写一个答案。
标签: python protocol-buffers proto